어떤 멤버변수 필드가 자신이 속한 클래스보다 다른 클래스에서 더 많이 사용 되어질 때 대상 클래스안에 새 필드를 선언하고 그 필드 참조 부분을 새 필드 참조 하도록 수정하자. 시스템이 발전하고 수정되어 앞으로 나아갈수록 새 클래스가 필요해지며 기능이 여기저기서 사용이 많아진다. 따라서 그러한 것들을 여기저기로 옮겨야 하는 상황과 필요가 있다. 지금은 합리적이고 올바르다고 판단해서 설계 및 개발을 했다 해도, 나중에는 그렇지 않을 수 있다. 문제는 그러한 상황에서 아무것도 하지 않는 것이다. 변경전 AccountType 클래스에서 interestRate 필드를 더 많이 사용하는 경우 class Account { private AccountType _accountType; private double _int..
메소드가 자신이 속한 클래스보다 다른 클래스의 기능을 더 많이 이용할 땐 그 메소드가 제일 많이 이용하는 클래스안으로 메소드를 이동하자 클래스에 기능이 너무 많거나 클래스가 다른 클래스와 과하게 연동되어 의존성이 지나칠 때는 메소드를 옮기는 것이 좋다. 옮기면 클래스가 간결해지며, 여러 기능을 더 명확하게 구현할수 있다. 옮기는 것이 판단하기 힘들거나 확신이 서지 않다면, 해당 메소드가 참조된 클래스를 확인해보고 직감에 따라 판단해서 옮겼더라도 나중에 다시 변경하면 된다. 변경전 class Account { private AccountType _accountType; private int _dayOverdrawn; double getOverdraftCharge() { if ( _accountType.is..
장황한 메소드에서 각 부분을 간결한 메소드로 변경해서 보면 코드가 이해하기 쉬워 진다. ...는데 짧고 간단한 소스예제라 잘 모르겠음 ㅋ 이 방법 길고 복잡한 소스에서는 어떨까? 1. 전환할 메소드의 이름과 같은 새 클래스(Gamma)를 생성 2. 새 클래스에 final 필드로 클래스와 멤버변수를 속성 추가 3. 생성자로 필요 변수들을 받을수 있도록 함 4. 복잡한 계산 로직을 나눔 5. 메소드 객체로 전환할 클래스에서 새로 만든 클래스와 메소드를 호출 변경 전 Class Account { int gamma(int inputVal, int quantity, int yearToDate) { int importantValue_1 = (inputVal*quantity) + getDelta(); int impo..
Parameter(매개변수)는 Method 호출 시 argument 로 넘어간 변수를 칭한다. 여기서 매개변수로의 값 대입은 Parameter로 받은 변수의 값을 호출한 Method에서 어떠한 값을 대입 하는 경우를 말한다. 전달받은 매개변수에 특정 Object나 Variable등을 참조 대입시에 코드의 명료성과 코드를 보는 이에게 Call by value 인지 Call by reference 인지 혼동을 불러 일으킬수 있다. 따라서, 매개변수로의 값 대입을 코드 작성할 시 지양해야 하며, 발견시에 해당 내용을 수정할 수 있도록 하자. 변경 전 int discount (int inputVal) { if (inputVal > 50) inputVal -= 10; // below code blah blah }..
사용된 수식이 봅잡할때 수식의 결과나 일부분을 직관적 이름의 임시변수에 대입 위에 조건문과 같은 경우에 논리조건문이 복잡해져서 코드를 보는 사람이 한번에 이해 하기 어려울때 사용하지만, 임시변수를 사용하면 메소드가 복잡해진다. 따라서, 더 좋은 방법이 없는지 생각해본 뒤 사용하자. 변경 전 if ( (platform.toUpperCase().indexOf('MAC') > -1) && (browser.toUpperCase.indexOf('IE') > -1) && wasInitialized() && (resize > 0) ) { // code blah blah } 변경 후 boolean isMac = platform.toUpperCase().indexOf('MAC'); boolean isIE = browse..
파일 4개를 생성 hosts_normal.txt 파일에는 기본 host 내용을 적고 hosts_test.txt 파일에는 추가할 ip와 domain 내용을 적고 저장한다 ## hosts_normal.bat 파일 내용 @echo off copy /Y C:\Windows\System32\drivers\etc\hosts_normal.txt C:\Windows\System32\drivers\etc\hosts ## hosts_test.bat 파일 내용 @echo off copy /Y C:\Windows\System32\drivers\etc\hosts_test.txt C:\Windows\System32\drivers\etc\hosts
개발에 있어서 . 리펙토링의 개념을 제대로 알고 있는가 . 상황에 맞는 적절한 디자인 패턴을 적용할 수 있는가 . 프로그램 버전과 문서화를 얼마나 꼼꼼히 하는가 . 최신 기술에 관심이 있는 사람인가, . 팀의 업무 문화와 수준을 올려줄 수 있다는 믿음을 주는 사람인가, . 팀 작업에 중점을 두는가, 본인에게 익숙한 것에 중점을 두는가, 개발 전 . 툴 활용 능력이 아예 없는 사람은 아닌가? . 자기 생각을 먼저 정리하고 문서화 하는가, . 다른 사람과의 대화를 통해 목적을 뚜렷이 하는가, 개발 중 . 사용하는 라이브러리나 프레임워크에 대한 지식이 있는가, . 설계의 간소화를 위해 노력하는가, 그리고 구현하는가, . 최신 기술을 얼마나 효율적으로 적용해 프로그램의 질을 향상하는가, . 툴이 알려준 경고들에..
참고 http://blog.sz21c.com/569 마이그레이션 1. java -jar svn-migration-scripts.jar authors svn://192.168.1.107/wms_kr02 > authors.txt 실행 후 authors.txt에 메일을 알맞게 변경한다. 2. git svn clone --authors-file=authors.txt --no-metadata svn://192.168.1.107/wms_kr02 3. SourceTree에서 해당 폴더 Open 후, 저장소 설정에 GitLab 주소와 아이디 정보 저장한다. 4. 소스트리 해당 저장소 패치를 받는다. 5. Push를 진행하는데, Branch에 주의해서 강제푸쉬+모든 태그에 대해서 푸쉬를 진행한다. GitLab 프로젝트에..
객체를 발견하고 창조하는 것은 지식과 행동을 구조화 하는 문제이다 (by. 레베카 위프스브록) 인간은 본능적으로 세상을 독립적이고 식별 가능한 객체의 집합으로 바라본다. 많은 사람들이 객체지향을 직관적이고 이해하기 쉽다고 하는 이유는 객체지향이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 기본적인 인지능력에 기반을 두고 있기 때문이다. 하지만 인간은 물리적인 한계를 넘어 추상적인 사물까지도 객체로 인식할 수 있다. (주문, 통장의 이체 등 손이나 눈에 안보이는 추상적인 것들) 저자는 이 장의 설명을 위해서 "이상한 나라의 앨리스" 책의 앨리스를 예로 들고 있다. 문을 지나 정원을 가기 위해서 앨리스는 키를 조정해야 한다. 병속의 액체나 케이크를 먹는 것으로 키를 조정할 수 있다고 하며 또, 버섯으..
"객체지향이란 실세계를 직접적이고 직관적으로 모델링 할 수 있는 패러다임" 현실 속에 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업. 즉, 객체지향 소프트웨어는 실세계의 투영이며 현실 세계 사물에 대한 추상화이다. 하지만, 현실은 객체에 직접적으로 대응되는 실세계의 사물을 발견한 확률은 높지 않다. 또 존재하더라도 유사성을 찾기가 매우 어려운 게 일반적이다. 화재의 확산을 막는 "방화벽" 과 네트워크의 침입을 막는 "방화벽" 을 예시로 실제 사물과 소프트웨어 객체 간의 의미적 거리와 연관성 간의 괴리를 예로 들을수 있다. 예 소프트 웨어에서 보는 객체 : 행위에 대한 "캡슐화(encapsulation)" 와 "자율성(autonomous)" 메시지(아규먼트) : 현실 세계의 사람들..