반응형 분류 전체보기145 [엘레강트 오브젝트] 3.7 인스토스펙션과 캐스팅을 피하세요 이 내용은 엘레강트 오브젝트 를 읽으면서 정리한 내용을 포함하고 있습니다. 들어가기 타입 인트로스펙션(introspection) 캐스팅(casting) 정리 관련해서 생각해볼 내용 들어가기 타입 인트로스펙션(introspection)과 캐스팅(casting)을 사용하고 싶은 유혹에 빠지더라도 절대로 사용해서는 안된다. 기술적으로 Java의 instanceof 연산자와 Class.cast() 메서드, 다른 언어에서 동일한 기능을 수행하는 연산자들이 모두 이 범주에 포함된다. public int size(Iterable items) { if (items instanceof Collection) { return Collection.class.cast(items).size(); } int size = 0; fo.. 2023. 3. 22. [엘레강트 오브젝트] 3.6 부 ctor 밖에서는 new를 사용하지 마세요 이 내용은 엘레강트 오브젝트 를 읽으면서 정리한 내용을 포함하고 있습니다. 부 ctor와 의존성 정리 부 ctor와 의존성 class Cash { private final int dollars; public int euro() { return new Exchange().rate("USD", "EUR") * this.dollars; } } 문제을 일으킨 범인의 이름은 하드코딩된 의존성인 new 연산자이다. new Exchange() Cash 클래스는 Exchange 클래스에 직접 연결되어 있기 때문에, 의존성을 끊기 위해서는 Cash 클래스의 내부 코드를 변경할 수 밖에 없다. 메서드 내부에서 new 연산자를 사용할 수 없도록 금지했다고 가정해본다면, 이제 객체가 새로운 객체를 직접 생성할 수 없기 때문에.. 2023. 3. 22. [엘레강트 오브젝트] 3.5 절대 getter와 setter를 사용하지 마세요 이 내용은 엘레강트 오브젝트 를 읽으면서 정리한 내용을 포함하고 있습니다. getter와 setter 정리 관련해서 생각해볼 내용 getter와 setter getter와 setter의 형태는 다음과 같다. class Cash { private int dollars; public int getDollars() { return this.dollars; } public void setDollars(int value) { this.dollars = value; } } 위 클래스는 다음과 같은 문제점이 있다. 이 클래스는 가변이고, 두 개의 메서드는 이름이 잘못 지어졌고, 생성자도 없다. 가변성, 메서드 이름, 생성자가 하나도 없다는 사실보다 더 큰 문제는 해당 클래스는 단순한 자료구조이다. 객체 대 자료구조 .. 2023. 3. 22. [엘레강트 오브젝트] 3.4 충성스러우면서 불변이거나, 아니면 상수이거나 이 내용은 엘레강트 오브젝트 를 읽으면서 정리한 내용을 포함하고 있습니다. 불변 객체 예시를 알아보자 정리 관련해서 생각해볼 내용 불변 객체 불변 객체의 잘못된 사고 방식 불변 객체의 메서드를 호출할 때마다 상수(constant)처럼 매번 동일한 데이터가 반환되리라 기대 다시 말해서 모든 불변 객체가 문자열 리터럴이나 숫자처럼 동작하리라고 생각 불변 객체의 정의에 따르면 적절해 보일 수도 있겠지만 결론적으로 이런 사고 방식은 틀렸다. 결과가 변하기 때문에 상수는 아니지만, 객체가 대표하는 엔티티에 충성하기 때문에 불변 객체로 분류된다. 객체의 정의는 다음과 같다. 디스크에 있는 파일, 웹 페이지, 바이트 배열, 해시맵, 달력의 월과 같은 실제 엔티티의 대표자 기본적으로 모든 객체는 식별자, 상태, 행동을.. 2023. 3. 22. [엘레강트 오브젝트] 3.3 인자의 값으로 NULL을 절대 허용하지 마세요 이 내용은 엘레강트 오브젝트 를 읽으면서 정리한 내용을 포함하고 있습니다. NULL NULL 처리 방법 정리 관련해서 참고해볼 내용 코드 어딘가에 NULL이 존재한다면 커다란 실수를 저지르고 있는 것이라고 말한다. 사실, 전달할 객체가 없으므로 값이 없는 것으로 간주하세요 라는 의사를 표현할 수 있도록 사용자에게 진짜 객체 대신 NULL을 전달하도록 허용하는 것은 일반적인 방법이다. NULL NULL을 허용하는 find() 메서드를 구현하기 위해서는 다음과 같이 분기를 처리할 필요가 있습니다. public Iterable find(String mask) { if (mask == NULL) { // 모든 파일을 찾는다 } else { // 마스크를 사용해서 파일을 찾는다 } }객체를 존중한다면 다음과 같이.. 2023. 3. 22. [엘레강트 오브젝트] 3.2 정적 메소드를 사용하지 마세요 이 내용은 엘레강트 오브젝트 를 읽으면서 정리한 내용을 포함하고 있습니다. 객체 대 컴퓨터 사고 선언형 스타일 대 명령형 스타일 유틸리티 클래스 싱글톤 패턴 함수형 프로그래밍 조합 가능한 데코레이터 정리 정적 메서드를 사용하는 대신 객체를 사용해야 한다. 정적 메소드만 있는 객체는 소프트웨어를 유지보수하기 어렵게 만든다. 객체 대 컴퓨터 사고 컴퓨터처럼 생각하기 순차적인 사고 방식 컴퓨터는 어떤 한 위치에서 명령을 실행하기 시작하고 또 다른 위치에서 실행을 중단한다. 명렁의 실행 흐름을 제어할 책임이 우리에게 있다. ex) 정적 메서드 객체지향적으로 생각하기 CPU에게 할 일을 지시하는 것이 아니라 정의 우리는 그저 누가 누구인지만 정의하고 객체들이 필요할 때 스스로 상호작용하도록 제어를 위임한다. ex.. 2023. 3. 12. 이전 1 2 3 4 5 ··· 25 다음 반응형