Трябва да потвърдите низове. Така че изобщо не се нуждаете от низове

TL;DR: Търсене на липсващи обекти на домейн при валидиране на низове.

проблеми

  • Примитивна мания.
  • „Биекционна грешка“
  • Валидираните низове са подмножество от всички възможни низове.
  • Нарушение на принципа „Fail Fast“.
  • Нарушение на принципа на единната отговорност.
  • Нарушение на принципа DRY.

Решения

  1. Създайте първокласен обект, представящ концепцията под MAPPER

Контекст

Сериозният софтуер има много проверки на низове.

Често те не са на правилните места.

Това води до нестабилен и корумпиран софтуер.

Простото решение е да се изградят само реални и валидни абстракции.

Примерен код

погрешно

<?
//First Example: Address Validation
class Address { 
  function __construct(string $emailAddress) {
     //String validation on Address class violates SRP
     $this->validateEmail($emailAdress);
     //...
   }
  private function validateEmail(string $emailAddress) {
    $regex = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
    //Regex is a sample / It might be wrong
    //Emails and Urls should be first class objects
    if (!preg_match($regex, $emailAddress))
    {
      throw new Exception('Invalid email address ' . emailAddress);
    }    
  }
}
//Second Example: Wordle
class Wordle { 
  function validateWord(string $wordleword){
    //Wordle word should be a real world entity. Not a subset of strings
  }
 }

вярно

<?
//First Example: Address Validation
class Address { 
  function __construct(EmailAddress $emailAddress) {
     //Email is always valid / Code is cleaner     
     //...
   }
}
class EmailAddress { 
  //We can reuse this object many times avoiding copypasting
  string $address; 
  private function __construct(string $emailAddress) {
    $regex = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
    //Regex is a sample / It might be wrong
    //Emails and Urls are first class objects
    if (!preg_match($regex, $emailAddress))
    {
      throw new Exception('Invalid email address ' . emailAddress);
    }   
    $this->address = $emailAddress;
  }
}
//Second Example: Wordle
class Wordle { 
  function validateWord(WordleWord $wordleword){
    //Wordle word is a real world entity. Not a subset of string
  }
 }
class WordleWord { 
  function __construct(string $emailAddress)
    //Avoid building invalid world words
    //For example length != 5
  }
 }

Откриване

[X] Полуавтоматичен

Можем да проверим всички конструктори, валидиращи низове и да „реифицираме“ липсващите концепции.

Етикети

  • Примитивна мания

Заключение

Малките предмети са трудни за намиране.

Примитивните маниаци винаги се оплакват от този вид индиректности.

Създаването на тези нови малки концепции поддържа нашия модел лоялен към биекцията и гарантира, че нашите модели винаги са здрави.

Връзки





Повече информация

  • „Единственият принцип за дизайн на софтуера“
  • „Как да разработим игра на Wordle“
  • „Реификация на обекта“

Кредити

Снимка от Brett Jordan на Unsplash

По-малко от 10% от кода е свързан с привидната цел на системата; останалата част се занимава с входно-изходни данни, валидиране на данни, поддръжка на структурата на данните и друга поддръжка.

Мери Шоу



Тази статия е част от поредицата CodeSmell.