Если он ходит как утка и крякает как утка, значит, это утка

TL;DR: не создавайте ненужных абстракций

Проблемы

  • Над дизайном
  • Ненужные классы

Решения

  1. Используйте стандартный класс

Контекст

Обнаружение абстракций на MAPPER — сложная задача.

После уточнения мы должны удалить ненужные абстракции.

Образец кода

Неправильный

<?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] Полуавтоматический

Основываясь на протоколах, мы должны удалить некоторые ненужные классы.

Теги

  • Протоколы

Исключения

Иногда нам нужно оптимизировать коллекции из соображений производительности, если у нас достаточно веских доказательств.

Заключение

Время от времени нам нужно очищать код.

Специализированные коллекции являются хорошей отправной точкой.

связи



Больше информации

Кредиты

Фото автора Pisit Heng на Unsplash

Большая часть усилий в сфере программного обеспечения уходит на поддержку уже существующего кода.

Витсе Венема



Эта статья является частью серии CodeSmell.