Comments 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. А, возможно вы про то что несколько форматов подойти может?
парсить первым подходящим
не первым, а единственным. Некоторые даты могут парситься разными способами, 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ить и находит даже сложные несостыковки
Пример из гибридной структуры пакетов не очень понятный. Хорошо бы его расписать подробнее. У меня всегда проблемы, когда в одном пакете надо использовать сущность из другого.
"Вспоминаю, как, будучи джуном, я думал, что более эффективно использовать аббревиатуры имён для идентификаторов"
Как вы стали Джуном?
Чистый код: как писать код, который легко читать