코드 냄새 12 - Null

13646 단어 oopcodenewbietutorial
프로그래머는 Null을 다른 플래그로 사용합니다. 부재, 정의되지 않은 값, 오류 등을 암시할 수 있습니다.
다중 의미 체계는 결합 및 오류로 이어집니다.

TL;DR: Null is schizofrenic and does not exist in real world. His creator regreted and programmers around the world suffer it. Don't be a part of it.


문제


  • 발신자와 발신자 간 결합.
  • 발신자와 발신자가 일치하지 않습니다.
  • If/Switch/Case 오염.
  • Null은 실제 개체에서 다형성이 아닙니다. 따라서 Null 포인터 예외
  • 현실 세계에 Null이 존재하지 않습니다. 따라서 위반

  • 솔루션


  • Null을 피하십시오.
  • if를 피하려면 NullObject pattern을 사용하십시오.
  • 사용 Optionals .





  • 예외


  • NULL이 존재하는 API, 데이터베이스 및 외부 시스템.

  • 샘플 코드



    잘못된




    class CartItem{
      constructor(price) {
         this.price = price;
      }
    }
    
    class DiscountCoupon {
      constructor(rate){
        this.rate = rate;
      } 
    }
    
    class Cart{        
        constructor(selecteditems, discountCoupon){
            this.items = selecteditems;
            this.discountCoupon = discountCoupon;
        }     
        subtotal(){    
            return this.items.reduce((previous, current) => previous + current.price, 0);      
        }  
        total(){    
            if (this.discountCoupon == null)
              return this.subtotal();
            else
              return this.subtotal() * (1 - this.discountCoupon.rate);      
        }
    }
    
    cart = new Cart([new CartItem(1), new CartItem(2), new CartItem(7)], new DiscountCoupon(0.15));
    //10 - 1.5 = 8.5
    
    cart = new Cart([new CartItem(1), new CartItem(2), new CartItem(7)], null);
    //10 - null  = 10
    

    오른쪽



    class CartItem{
      constructor(price) {
         this.price = price;
      }
    }
    
    class DiscountCoupon {
      constructor(rate){
        this.rate = rate;
      } 
      discount(subtotal){
        return subtotal * (1 - this.rate);    
      }
    }
    
    class NullCoupon {    
      discount(subtotal){
        return subtotal;    
      }
    }
    
    class Cart{        
        constructor(selecteditems, discountCoupon){
            this.items = selecteditems;
            this.discountCoupon = discountCoupon;
        }     
        subtotal(){    
            return this.items.reduce((previous, current) => previous + current.price, 0);      
        }  
        total(){    
            return this.discountCoupon.discount(this.subtotal());      
        }
    }
    
    cart = new Cart([new CartItem(1), new CartItem(2), new CartItem(7)], new DiscountCoupon(0.15));
    //10 - 1.5 = 8.5
    
    cart = new Cart([new CartItem(1), new CartItem(2), new CartItem(7)], new NullCoupon());
    //10 - nullObject  = 10
    

    발각



    대부분의 Linter는 null 사용을 표시하고 경고할 수 있습니다.

    태그



  • 결론


  • Null은 10억 달러의 실수입니다. 그러나 대부분의 프로그램 언어는 이를 지원하고 라이브러리는 사용법을 제안합니다.

  • 더 많은 정보



  • 학점



    사진 제공: Kurt Cotoaga on Unsplash

    I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.



    토니 호어






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




    마지막 업데이트: 2021/06/16

    좋은 웹페이지 즐겨찾기