Трябва да потвърдите низове. Така че изобщо не се нуждаете от низове
TL;DR: Търсене на липсващи обекти на домейн при валидиране на низове.
проблеми
- Примитивна мания.
- „Биекционна грешка“
- Валидираните низове са подмножество от всички възможни низове.
- Нарушение на принципа „Fail Fast“.
- Нарушение на принципа на единната отговорност.
- Нарушение на принципа DRY.
Решения
- Създайте първокласен обект, представящ концепцията под 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.