Code Smell 134 - 전문 비즈니스 컬렉션

11959 단어 javatutorialoopwebdev
오리처럼 걷고 오리처럼 꽥꽥거린다면 오리임에 틀림없다.

TL;DR: Don't create unnecessary abstractions



문제


  • 오버디자인
  • 불필요한 클래스

  • 솔루션


  • 표준 클래스 사용

  • 문맥



    에서 추상화를 발견하는 것은 어려운 작업입니다.

    다듬은 후에는 불필요한 추상화를 제거해야 합니다.

    샘플 코드



    잘못된




    <?php
    
    Namespace Spelling;
    
    final class Dictionary {
    
        private $words;
        function __construct(array $words) {
            $this->words = $words;
        }
    
        function wordsCount(): int {
            return count($this->words);
        }
    
        function includesWord(string $subjectToSearch): bool {
            return in_array($subjectToSearch, $this->words);
        }
    }
    
    //This has protocol similar to an abstract datatype dictionary
    //And the tests
    
    use PHPUnit\Framework\TestCase;
    
    final class DictionaryTest extends TestCase {
        public function test01EmptyDictionaryHasNoWords() {
            $dictionary = new Dictionary([]);
            $this->assertEquals(0, $dictionary->wordsCount());
        }
    
        public function test02SingleDictionaryReturns1AsCount() {        
            $dictionary = new Dictionary(['happy']);
            $this->assertEquals(1, $dictionary->wordsCount());
        }
    
        public function test03DictionaryDoesNotIncludeWord() {
            $dictionary = new Dictionary(['happy']);
            $this->assertFalse($dictionary->includesWord('sadly'));
        }
    
        public function test04DictionaryIncludesWord() {
            $dictionary = new Dictionary(['happy']);
            $this->assertTrue($dictionary->includesWord('happy'));
        }
    } 
    
    

    오른쪽



    <?php
    
    Namespace Spelling;
    
    // final class Dictionary is no longer needed
    
    //The tests use a standard class 
    //In PHP we use associative arrays
    //Java an other languages have HashTables, Dictionaries etc. etc.
    
    use PHPUnit\Framework\TestCase;
    
    final class DictionaryTest extends TestCase {
        public function test01EmptyDictionaryHasNoWords() {
            $dictionary = [];
            $this->assertEquals(0, count($dictionary));
        }
    
        public function test02SingleDictionaryReturns1AsCount() {
            $dictionary = ['happy']; 
            $this->assertEquals(1, count($dictionary));
        }
    
        public function test03DictionaryDoesNotIncludeWord() {
            $dictionary = ['happy']; 
            $this->assertFalse(in_array('sadly', $dictionary));
        }
    
        public function test04DictionaryIncludesWord() {
            $dictionary = ['happy'];  
            $this->assertTrue(in_array('happy', $dictionary));
        }
    } 
    
    

    발각



    [X] 반자동

    프로토콜에 따라 불필요한 클래스를 제거해야 합니다.

    태그


  • 프로토콜

  • 예외



    충분한 강력한 증거가 있는 경우 성능상의 이유로 컬렉션을 최적화해야 하는 경우가 있습니다.

    결론



    때때로 코드를 정리해야 합니다.

    전문 컬렉션은 좋은 출발점입니다.

    처지







    더 많은 정보


  • Duck Typing

  • 학점



    Unsplash의 Pisit Heng 님의 사진


    Most of the effort in the software business goes into the maintenance of code that already exists.



    비에체 베네마






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


    좋은 웹페이지 즐겨찾기