Null 개체 모드 의 사용법

1、 Null 개체 모드 가 뭐 예요?왜 Null 대상 을 채택 합 니까?
    개인 적 으로 모델 이란 프로그래머 들 이 프로 그래 밍 을 할 때 비슷 한 문 제 를 정리 하 는 통용 적 인 해결 방법 이나 사고 라 는 것 을 이해한다.따라서 당신 의 문제 가 특정한 디자인 모델 에 대응 하 는 문제 에 매우 부합 되 더 라 도 기 존의 특정한 디자인 모델 이 우리 프로 그래 밍 중의 구체 적 인 디자인 문 제 를 완전히 해결 할 수 있 기 를 기대 할 수 없습니다.
잡담 은 적 게 하고 본론 으로 들 어가 라.
    Null 대상 모드 는 말 그대로 빈 대상 으로 아무것도 하지 않 는 다.
혹시 아무것도 안 하 는데 왜?다음 null 대상 의 전형 적 인 예 를 보 세 요.
코드 세그먼트 1:
Employee e = DB.getEmployee();
If(null == e && e.isTimeToPay(today))
    e.pay();
예 를 들 어 대상 이 null 인지 아 닌 지 를 판단 한 다음 에 서로 다른 동작, 즉 월급 을 지급 하 는 지 여 부 를 판단 해 야 한다.만약 당신 의 프로그램 에서 'null = = e' 라 는 것 을 판단 하 는 것 이 많다 면, Martin Fowler 가 '재 구성' 이라는 책 에서 말 한 것 에 따 르 면 바로 당신 의 코드 에서 나 쁜 냄새 가 났 다 는 것 입 니 다. 그것 을 없 애 야 합 니 다!!!
    Null 대상 을 사용 한 후에 DB. getEmployee () 가 되 돌아 오 는 Null 대상 과 Employee 대상 이 같은 인 터 페 이 스 를 가지 기 때문에 Null 대상 을 되 돌려 준 후에 도 코드 세그먼트 2 를 사용 할 수 있 습 니 다. 다만 이 시공 대상 은 아무것도 조작 하지 않 았 기 때문에 상기 코드 는 다음 과 같이 간략화 할 수 있 습 니 다.
코드 세그먼트 2:
Employee e = DB.getEmployee();
If(e.isTimeToPay(today))
    e.pay();
    프로그램 개발 에 있어 서 이와 같은 여러 가지 문제 가 있 습 니 다. 예 를 들 어 아래 에 avl 트 리 노드 를 추가 하 는 함수 코드 는 avl 트 리 에 노드 (노드 류 의 인 터 페 이 스 는 IAVLNode 이 고 실현 류 는 AVLNode) 를 추가 하 는 것 입 니 다. 함수 에서 먼저 루트 노드 가 비어 있 는 지 판단 하고 비어 있 으 면 새로 추 가 된 노드 를 루트 노드 로 설정 합 니 다.그렇지 않 으 면 적당 한 위 치 를 찾 아 노드 를 추가 합 니 다.
코드 세그먼트 3:
//    
       {
           avlRoot = addNode;
           return;
       }
      
       IAVLNode curNode = avlRoot;
       IAVLNode parentNode = avlRoot;
       while(null != curNode)
       {
           parentNode = curNode;          
           if(curNode.getValue() < addNode.getValue())
              curNode = curNode.getRightChild();
           else
              curNode = curNode.getLeftChild();
       }
       if(parentNode.getValue()< addNode.getValue())
           parentNode.setRightChild(addNode);
       else
           parentNode.setLeftChild(addNode);
       addNode.setParentNode(parentNode);
    }
위의 함수 코드 중 두 군데 가 노드 가 비어 있 는 지 판단 해 야 합 니 다. AVL 트 리 회전 을 쓰 려 면 분명 합 니 다.(바로 균형 이 진 트 리 에서 노드 를 추가 한 후의 네 가지 균형 을 조정 하 는 작업 입 니 다. 즉, 왼쪽, 왼쪽 삽입 시 우회전, 오른쪽 삽입 시 좌회전, 좌우 삽입 시 좌우 두 번 회전, 오른쪽 왼쪽 삽입 시 오른쪽 왼쪽 두 번 회전 이 필요 합 니 다) 코드 입 니 다. 코드 에서 노드 가 비어 있 는 지 판단 하 는 작업 이 많 을 것 입 니 다!!!!
 2、 Null 대상 을 어떻게 정의 하고 사용 합 니까?
이 어 1 절 avl 트 리 의 예 를 들 어 Null 대상 을 어떻게 정의 하고 사용 하 는 지 설명 한다. 특히 실제 작업 에서 사용 할 수 있 는 실현 방식 은 여러 가지 가 있다. 본 고 는 그 중의 하나 일 뿐 이 를 위해 자신의 사 고 를 속박 하지 말 아야 한다.
Null 대상 은 하나만 필요 하기 때문에 단일 모드 를 사 용 했 습 니 다. 구체 적 인 정 의 는 다음 과 같 습 니 다.
코드 세그먼트 4:
public class NullNode implements IAVLNode {
 
    private static NullNode nullObj= null;
    private NullNode(){}
   
    public static NullNode GetNullObj()
    {
       if(null == nullObj)
           nullObj = new NullNode();
       return nullObj;
    }
   
    @Override
    public boolean isNullObj() {
       // TODO Auto-generated method stub
       return true;
    }
   
    @Override
    public void DisplayInfo() {
    }
 
    @Override
    public IAVLNode getParentNode() {
       return null;
    }
 
    @Override
    public void setParentNode(IAVLNode parentNode) {
    }
 
    @Override
    public int getValue() {
       return 0;
    }
 
    @Override
    public void setValue(int value) {
    }
 
    @Override
    public IAVLNode getLeftChild() {
       return null;
    }
 
    @Override
    public void setLeftChild(IAVLNode leftChild) {
    }
 
    @Override
    public IAVLNode getRightChild() {
       return null;
    }
 
    @Override
    public void setRightChild(IAVLNode rightChild) {
    }
 
    @Override
    public int getDepth() {
       return 0;
    }
 
    @Override
    public void setDepth(int depth) {
    }
 
    @Override
    public boolean isBalance() {
       return true;
    }
}
이 Null 대상 에 서 는 인터페이스 IAVLNode 를 계승 해 이 인터페이스의 모든 조작 을 실 현 했 지만, 이 조작 들 은 아무것도 하지 않 았 다.
 3、 Null 대상 은 또 어떤 부족 함 이 있 나 요?
1)   본 고 를 시작 할 때 Null 대상 의 주요 해결 문제 중 하 나 는 바로 프로그램 에서 null 에 대한 대량의 판단 이다.그러나 실제 응용 에서 'null = = avlRoot' 와 같은 코드 를 모두 제거 할 수 있 는 것 은 아니다. 일부 상황 에서 대상 이 비어 있 는 지 판단 해 야 할 때 'avlRoot. isNull' 을 호출 해 야 한다.
2)   어떤 때 는 빈 대상 의 빈 함수 가 실현 되 기 가 비교적 어 려 울 때 가 있 습 니 다. 예 를 들 어 코드 세그먼트 3 의 getValue () 함수 입 니 다. 여 기 는 Null 대상 의 이 함수 가 어떤 값 을 되 돌려 주 는 지 잘 모 르 겠 습 니 다. 코드 세그먼트 4 에서 0 을 되 돌려 주 었 습 니 다. 만약 에 제 가 프로그램 에서 노드 간 의 값 크기 를 비교 해 야 한다 면 이 시공 대상 이 돌아 오 는 0 값 은 적당 하지 않 습 니 다.

좋은 웹페이지 즐겨찾기