Рубрики
Без рубрики

Как овладеть искусством типа специфики

Делайте более конкретные определения приводят к меньшей гибкости? В этом посте я постараюсь избежать дискуссий о сильных / статических по сравнению с слабыми / динамическими типами (что еще может быть сказано?) Или даже схема против схемы меньше структур данных. Вместо этого я хочу сосредоточиться на степени зернистости

Автор оригинала: Jeff M Lowery.

Делайте более конкретные определения приводят к меньшей гибкости?

В этом посте я постараюсь избежать споров о Сильный/статический против Слабый/динамический Типы (что еще может быть сказано?) Или даже Схема против Схема меньше Структуры данных. Вместо этого я хочу сосредоточиться на степени гранулярности определений типа: каковы эффекты и компромиссы?

На одном конце спектра очень общие определения охватывают потенциал Свойства и поведение объектов. На другом конце у вас богатая иерархия типов, из которых некоторые тонко отличаются от некоторых других.

Я прикоснув к печати утки, SQL Tater-Per-Type (TPT) и концепции таблицы и иерархии (TPH) и параметризованных API.

Когда вы думаете о универсальных типах, вы можете подумать об объекте документа (DOM), схеме XML или YAML, буквальных объектах в JavaScript или документах базы данных NoSQL. Это широко общие, в том, что существуют минимальные ограничения на структуру, отношения и содержание.

Вместо этого давайте обсудим пользовательские типы. Они могут или не могут быть использованы языком программы или схемой, но будут ограничения, предполагаемые или иным образом, в коде, которые касаются их. Давайте использовать Автомобиль как аналогия.

Транспортное средство

Автомобиль – это широкая концепция. Даже если мы ограничиваем обсуждение на колесные транспортные средства, которые охватывают все из трехколесных велосипедов до полусвалов. Можете ли вы охватывать спектр свойств и поведения этих трехколесных велосипедов, автомобилей и семии в одном типе? Да, ты мог бы Отказ Понятно, что это будет представлять некоторые проблемы при обработке экземпляров автомобилей в программном коде.

Тип автомобиля

Возможные свойства и методы транспортного средства:

  • Шины * Номер * Тип [пневматический, другой]
  • Сиденья * Номер * мягкий [логический]
  • рулевое управление [колесо, руль]
  • двигатель * Тип [Нет, газ, дизель] * Количество цилиндров [только если тип – это газ или дизель]
  • водить машину()
  • топливо()
  • огни [на | высоко | выключен]

Благодаря чему минимальный набор свойств типа автомобиля охватывает огромный домен и представляет некоторые проблемы, целостность данных является одним из них. Если мой автомобиль является трикером, у меня нет двигателя. Если у меня нет двигателя, недвижимость Количество цилиндров бессмысленно. Если у меня есть трика без двигателя, но Количество цилиндров> 0 Это ошибка?

Я могу топить машину или грузовик, но не трехколесный велосипед. Что произойдет, если топливо () называется экземпляром трехколесного велосипеда? Бросить ошибку? Возможно, что какая-то логика приложений смущена, но может ли запрос быть решен изящно как NO-OP?

Одно предполагаемое преимущество для автомобиля в том, что он гибкий. Если мы вместо этого отделим автомобиль на подклассы Автомобиль и Педальвегику , мы могли бы поставить следующее в мошеревелике, но не педальвехлу:

  • руль]
  • двигатель * Тип [газ, дизель] * Количество цилиндров
  • топливо()
  • огни [на | высоко | выключен]

Это, казалось бы, имеет смысл. Это мыщено, хотя, что трехколесный велосипед имеет огни. Возможно, у него может быть газ или дизельный двигатель (в любом случае, не детский троик), но это мог бы есть электрический двигатель. Если эти случаи возникают, то есть какая-то рефакторинг.

На некоторых языках или системах управления данными вы можете определить интерфейсы и составлять бетонные типы, которые выполняют эти интерфейсы. Таким образом, у вас может быть предстоит определение, что может иметь соответствующие интерфейсы IElectricvehicle и InternationCumbustionveHicle (которые, в свою очередь, могут быть разбиты в игасегику и удовольствиеведу).

Интерфейсы дешевые для определения, и хорошо в концепциях аннотации, но они не полное решение. Некоторые интерфейсы могут быть несовместимы с другими: Может ли грузовик быть как грузовиком мороженого и грузовиком для доставки пиццы? Я полагаю, если вы хотите холодную пиццу или теплое мороженое.

Помимо этого, более специфических ящиков, которые вы находите, и требуют, чтобы вы имели предвидение всех типов транспортных средств, которые вы столкнетесь.

Это исключения Это собирается заставить вас с течением времени.

По этой причине, особенно когда домен широкий и в потоке, может быть заманчиво определить объекты транспортных средств менее конкретно. Вы хотите быть открытым для всего, что наступает на щуку (простите на каламке).

Кодирование против родовых типов

На кодирующей стороне не может быть допущений о том, какой автомобиль есть. Вы должны проверить каждое свойство для существования. Методы, которые существуют, могут быть бессмысленными для конкретной субъекты, которая представлена транспортным средством. Ваша лучшая ставка – это не предпринять код ничего. Это делает тестирование проблемой, хотя. Как вы можете включить все разумные конфигурации автомобилей в ваших тестах?

С другой стороны, у вас довольно гибкая система; То есть, если допущения не подсказуются в вашем коде (больше об этом в … Почему утка ? “).

Слишком много специфичности требует постоянных корректировок к модели типа, включая решения о том, что тамономия наследства является, какая собственность идет на какой уровень, и потенциальные трудности в изменениях в модели, когда они влияют на не только код на слое данных, а презентацию слой тоже. Если вы получите это неправильно (из-за поспешного анализа) у вас много непрерывных переделок.

Типы и их свойства

Если вы покупаете Захватить коробку вещей Из магазина онлайн-новинки вы можете ожидать коробки. У вас есть расплывчатое представление о том, что он содержит, но вы не будете знать, пока вы не откроете его и разберете каждый элемент один за другим. Нагрузка на вас, клиент, и есть ограниченные предположения, которые вы можете сделать (можно надеяться на резиновую курицу, но нет гарантии!).

Набор первой помощи имеет более узкий ассортимент возможностей относительно того, что он содержит. Это более конкретный тип объекта, и вы можете сделать предположения относительно его содержания и действовать соответственно. Он собирается содержать марли и повязки. У него будет антисептик, и, вероятно, обезболивающие. За то, что это может Содержать, вам хотя бы лучше понять, что искать.

Почему утка?

Утка печатает по заболеваемости, а не декларации. Программа логики вращается вокруг допроса объекта: «Кстати, у вас есть собственность A? У вас есть метод b? … “.

Действия проводятся на основе ответов на допрос. Если он ходит как утка, квитанцы, как утка и имеют перья, то это, наверное, утка. Логика, основанная на укете, набрав, действительно не заботится, утка или нет, потому что это ничего не принимает; Работает на том, что он находит.

Тем не менее, предположения будут ползать в любой логике программного обеспечения, которая считает, что это то, что ожидает. Возможно, целых 50% обслуживания программного обеспечения включает в себя фиксацию неверных предположений или уточнения тех, которые там есть.

Утка печатает и первый ответчик

Скажем, у меня есть огонь на кухне и позвоните в экстренный номер. Первый ответчик имеет значок, шлем и прибывает в автомобиль с сиреной и мигающими огнями. Ура! Пожарный! Мой дом спасен. Я командую, указывая на кухню: «Поставь этот огонь!»

Полицейман смотрит на меня, терпеливо.

Я сделал все мои утки, печатая допрос, но достигла неверного предположения. Может быть, город недавно решил, что полицейские должны ответить на пожарную сигнализацию, если поблизости, чтобы помочь пожарным.

Теперь я должен добавить в мой список вопросов: «Вы пускаете пожары?»

Свойств, дискриминаторы и названные типы

Утка, набрав чрезвычайно гибко, но ваш код должен иметь дело с каждым объектом, как если бы это было что-то. Вместо того, чтобы допросить все свойства, хотя вы можете добавить специальный дискриминатор Свойство, которое определяет тип объекта, который принимает ваш код. Одно допрос, и вы уходите на гонки. Конечно, объект должен иметь правильное значение дискриминатора.

Именому типу реже приведет к вам проблемы, так как типы присваиваются при создании объекта. В слабом языке, таком как JavaScript, вещи могут быть не так, как кажется, но вы несколько более безопасны предположить.

Тем не менее, дискриминаторы или типы не решают проблему специфики. Хороший старый тип объекта не говорит о его экземплярах. Это тип, он делает некоторые гарантии, но не делают мало самого.

Вы можете пройти объектный буквальный метод, но метод должен либо 1) предположить, что он получает, или 2) Будьте готовы выяснить.

Поддержание кода, которое обрабатывает универсальные типы, может быть упражнением в обострении: пока вы можете увидеть, какой код клиента может сделать, знать, что это Будет ли Требуется, требуется специфики данных, которые он управляет.

Отладчик помогает, но если ваша точка останова похорона далеко вниз в стеке вызовов, или находится в ответ на обратный вызов, удачи! У вас могут быть некоторые тяжелые раскопки, чтобы узнать, как у вас есть где вы находитесь, логика-мудрый.

Таблица на тип и таблица-иерархия

Реляционные базы данных вступают в эту проблему. Если таблица представляет собой тип вещи, все строки в таблице Тип-гомогенный ? Или может каждая строка отражать более конкретный тип, и таблица представляет собой супертип этих вещей?

В первом случае (таблица для каждого типа или TPT) каждый столбец в каждой строке гарантированно содержит допустимое значение (нуль может быть действительным). Ваш код может предвидеть результаты запросов, которые соответствуют их однородности.

Во втором случае некоторые столбцы или значения столбцов могут быть действительными для некоторых типов (строк), но не для других. Это таблица-тип-иерархия или TPH.

Таблица TPH является свободно определенным типом. Целостность значений столбцов в каждой строке зависит от логики программы. Если у меня есть таблица, называемая автомобилем, содержащими данные для всех автомобилей в моем домене, то столбец «Вес масла» не будет применим для строк, представляющих трехколесные велосипеды.

Бремя теперь находится в клиентском коде для понимания различных возможных типов транспортных средств в таблице автомобиля и соответственно выполняет логику. Это очень похоже на случай напечатанного напечатанного объекта утки, где свойства могут или не могут быть применимы для каждого экземпляра общего типа.

Схема, кто-нибудь?

Ухаживает ли схема (или другая система) в этой проблеме? Ну нет. Как только что показано, схема TPH в реляционной базе данных может представлять супер-тип, но строки могут каждый определять более специфические объекты. Значение столбца дискриминатора может помочь сортировать подтип каждой строки, но он должен быть проверен в логике программы.

Основным преимуществом использования TPH является избегать огромной схемы с множеством таблиц и уменьшать количество соединений, необходимых для соединения данных для экземпляра типа. Всегда есть компромиссы на любой подход.

Списки параметров и опции

Параметры метода являются еще одним вопросом. Наиболее распространенным корпусом является то, где тип параметра определяется по порядку возникновения:

function circle(int x, int y, double radius){…}

или

function circle(Position xy, double radius){…}

Аргументы определены этот способ заблокированы: например, вы не можете передавать логию на радиус. В JavaScript нет типизированных параметров, поэтому большинство функций предполагают тип на основе порядка возникновения.

Не только тип параметра, известного (путем объявления) или предполагаемой (по соглашению), количество параметров диктует, как называется метод.

Я всегда чувствую небольшое раздражение всякий раз, когда я хочу сбросить некоторые отформатированные JSON на консоль и придется набирать JSON.Stringify (OBJ, NULL , 4) Отказ Этот второй аргумент, который используется редко, предназначен для Заменяющий параметр.

Параметры

В JavaScript вы можете пройти объектный литерал в качестве аргумента, и это часто используется в качестве именованного списка параметров. Названные параметры более гибки, чем список аргументов, а для более сложных методов они могут быть очень полезными.

function circle(options) {
    const {x, y, radius, ...rest} = options;
    if (rest.linewidth) {...}
    if (rest.fillColor) {...}
    ...
}

Гибкий, да, но много допроса. Плюс аргументы х, у и Радиус предполагается там. Наилучшая практика, похоже, должна смешивать список параметров, специфичного типа с более «универсальным» литералом объекта:

function circle(x, y, radius, options){...}

Где варианты обычно понимают, чтобы обратиться к объект, свойства которого документированы Отказ

Что делать?

Несколько практик в программном обеспечении полностью хорошо или плохо (GoTo является исключением [ ? ]). Жесткая система, богатая типа, без сомнения, предотвратит некоторые ошибки кодирования, даже если эти типы не соблюдаются сильно применяются языком или базой данных. Код, который использует определенные типы, более читаемый.

С другой стороны, строгое иерархия типа типа представляет метаданные, которые должны поддерживаться, и часто клиент знает, что он запрашивает и знает, что он получит. Дтактикуйте каждый «я» и пересекаю каждый «T» только ради передачи данных между двумя внутренними методами, кажется, как бухгалтерские работы.

Нет правильного ответа, и большинство программистов используют типы различных (или нет) специфики. Многое зависит от домена. Если вы пишете код для финансовой системы, кажутся ли вы, что вы захотете богатый и жесткий набор определений типа; Тем не менее, я понимаю некоторые финансовые системы написано в шамптах Так что я знаю?

Оригинал: “https://www.freecodecamp.org/news/the-art-of-type-specificity-d0fdb6918e45/”