코드 냄새 126 - 가짜 Null 객체

14849 단어
Null 개체는 The Billion Dollar Mistake의 훌륭한 대안입니다. 때때로 우리는 그것들이 필요하지 않습니다

TL;DR: Don't abuse patterns. Even NullObject.



문제


  • 빈 클래스
  • 네임스페이스 오염
  • 중복 동작

  • 솔루션


  • 인스턴스화 실제 개체 클래스를 만듭니다.

  • 문맥



    Null 객체 패턴은 and의 훌륭한 대안입니다(둘 다 코드 냄새입니다).

    패턴의 구조는 계층 구조를 만들도록 지시합니다.

    이것은 꼭 필요한 것은 아닙니다. 실제 객체가 null 객체에 대해 다형성이 되어야 합니다.

    상속은 다형성을 달성하는 적절한 방법이 아닙니다.

    간단한 해결책은 null 객체처럼 작동하는 실제 객체를 만드는 것입니다.

    예: '0'은 숫자의 null 개체입니다.

    ''(또는 "")는 String의 null 객체입니다.

    빈 컬렉션은 컬렉션의 null 개체입니다.

    샘플 코드



    잘못된




    abstract class Address {
        public abstract String getCity();
        public abstract String getState();
        public abstract String getZipCode();
    }
    
    //Using inheritance for null objects is a mistake
    //We should use interfaces (when available)
    public class NullAddress extends Address {
    
        public NullAddress() { }
    
        public String getCity() {
            return Constants.EMPTY_STRING;
        }
    
        public String getState() {
            return Constants.EMPTY_STRING;
        }
    
        public String getZipCode() {
            return Constants.EMPTY_STRING;
        }
    
    }
    
    public class RealAddress extends Address {
    
        private String zipCode;
        private String city;
        private String state;
    
        public RealAddress(String city, String state, String zipCode) {
            this.city = city;
            this.state = state;
            this.zipCode = zipCode;
        }
    
        public String getZipCode() {
            return zipCode;
        }
    
        public String getCity() {
            return city;
        }
    
        public String getState() {
            return state;
        }
    
    }
    

    오른쪽



    //There are just "addresses"
    public class Address {
    
        private String zipCode;
        private String city;
        private String state;
    
        public Address(String city, String state, String zipCode) {
        //Looks anemic :(
            this.city = city;
            this.state = state;
            this.zipCode = zipCode;
        }
    
        public String zipCode() {
            return zipCode;
        }
    
        public String city() {
            return city;
        }
    
        public String state() {
            return state;
        }
    
    }
    
    Address nullAddress = new Address(Constants.EMPTY_STRING, Constants.EMPTY_STRING, Constants.EMPTY_STRING);
    //we have our null object
    //we should NOT assign it to a singleton, static or global
    //It behaves like a null object. That's enough
    //No premature optimizations
    
    

    발각



    [X] 수동

    이것은 시맨틱 냄새입니다.

    태그



  • 결론



    Null 개체 클래스를 만드는 것은 때때로 과도하게 설계됩니다.

    실제 개체를 만들어야 합니다.

    이 실제 객체는 , , 또는 이어야 합니다.

    피해야 할 냄새가 너무 많습니다.

    처지


























    더 많은 정보


  • Null Object Wikipedia
  • Refactoring.guru

  • 학점



    사진 제공: Juan Davila on Unsplash

    자신의 과정Diseño a la Gorra(스페인어)에서 이 아이디어를 제공한 Hernan Wilkinson에게 감사드립니다.


    All models are wrong but some models are useful



    조지 박스






    이 기사는 CodeSmell 시리즈의 일부입니다.


    좋은 웹페이지 즐겨찾기