Как стать автором
Обновить

Чистый код: как писать код, который легко читать

Время на прочтение11 мин
Количество просмотров17K
Всего голосов 18: ↑17 и ↓1+21
Комментарии17

Комментарии 17

"В этом контексте я точно буду использовать что-то вроде третьего примера, потому что первый пример слишком неоднозначен для требований нашего проекта."

Чет мне кажется, что в большинстве контор за такой метод сразу уволят.

getYYYYMMDDFormattedDateFromIso8601Format(date: String) : String

Метод принимает строку, а в имени аргумента написано про дату. Метод возвращает строку, а в имени метода написано про дату. Не всякая строка является датой


Можно разделить парсинг строки с датой и запись полученной даты в заданном формате


Формат (соответствующий YYYYMMDD из примера) можно передавать отдельной объектом (или строкой на крайняк), видел такое в стандартных библиотеках C++ и Python

Я бы сделал это на типах. Структурка для YYYYMMDD, структурка для ISO8601, обе с приватными полями, проверка строки на валидность происходит в конструкторе, имеет метод to_string(). Внутри можно и ту же самую строку хранить, тут уже не важно. Важно, что можно сократить имя функции, но при этом всё равно четко ясно, что на входе и что на выходе.

Именно, это отличный подход, использующий семантику языка программирования вместо семантики естественного языка

НЛО прилетело и опубликовало эту надпись здесь

Хорошо, а если пришла строка про которую заранее не известно, в каком формате в ней дата?
Можно создать абстрактный класс Date.Format, с методами bool fit(string) и Date parse(string), через наследование от него определить разные форматы. И класс Detector, который в данной простой реализации будет пробовать разные форматы (Date.Format.fit) и парсить первым подходящим

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

Не понял. Если представление — это про to..., то это отдельная от парсинга штука, реализовать ее можно в классе Date


P.S. А, возможно вы про то что несколько форматов подойти может?

P.S. А, возможно вы про то что несколько форматов подойти может?

Ну да.

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

парсить первым подходящим

не первым, а единственным. Некоторые даты могут парситься разными способами, 01.02.2021, например

Лучше явно указывать формат и парсить всегда с указанием

В C++ я бы вообще вот так сделал:


template <class T> concept DateFormat = ...;

template <DateFormat SourceFormat, DateFormat DestinationFormat>
std::string DateConvertString(std::string_view input);

auto output = DateConvertString<Date::Iso8601, Date::YYYYMMDD>(input);

Я не знаю как в Питоне, но в c# при написании метода я сразу во время набора вижу тип аргументов и возвращаемого значения. Поэтому указывать их избыточно

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


P.S. В питоне есть type-hintы и, например, для vscode дополнение pylance в строгом режиме заставляет все type-hintить и находит даже сложные несостыковки

например, для vscode дополнение pylance в строгом режиме заставляет все type-hintить

  1. Придумать язык с неявной динамической типизацией.
  2. Придумать костыль для языка, делающий типизацию явной.

Пример из гибридной структуры пакетов не очень понятный. Хорошо бы его расписать подробнее. У меня всегда проблемы, когда в одном пакете надо использовать сущность из другого.

"Вспоминаю, как, будучи джуном, я думал, что более эффективно использовать аббревиатуры имён для идентификаторов"

Как вы стали Джуном?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий