«Вам это не понадобится» (аббревиатура: YAGNI) - это принцип экстремального программирования (XP), который гласит, что программист не должен добавлять функции, пока не сочтет это необходимым.
[…] «Всегда внедряйте вещи, когда они вам действительно нужны, а не тогда, когда вы просто предвидите, что они вам нужны ».

Википедия, Вам это не понадобится

Необходимость

Его электронное письмо было коротким и почти безграмотным: «Эй, нужна функция для экспорта подписчиков, согласившихся на рассылку, спасибо». Никакой адресации, никаких остановок, ничего. Только эта единственная строчка. Но все же идеальная характеристика.

О реализации была минута на написание. Поместите на страницу кнопку «Экспорт». Получите электронные письма. Скинуть их в файл. Сделанный.

Предвиденное

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

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

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

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

Я сбил ступеньки и наехал на грубый бетон. Кроме того, почему экспорт только в CVS? Я предполагаю, что большинство пользователей захотят иметь прямой экспорт в файлы Excel.

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

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

На скалы и пять шагов вверх. И получить это общее решение довольно тривиально.

Я остановился у своей машины, задыхаясь. Нам нужен простой IEntityExporter<T> интерфейс с одним методом Export(IEnumerable<T> entities).

Я сел на пассажирское место и снял ботинки, носки и штаны. T - это совокупная проекция корня.

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

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

Становилось холодно, и ветер дул с постоянной кинетической атакой. Пользовательский интерфейс получал доступные экспортеры для конкретного типа проекции через EntityExporterProvider.

Я вернулся к машине и сел на пассажирское сиденье. Вся реализация тривиальна.

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

Западный горизонт теперь стал темно-синим. Должно быть не менее одиннадцати. Добавление и удаление экспортеров во время выполнения - это не просто шаг вперед.

Через некоторое время я зажег свечу и поставил ее на приборную панель. Это дало бы нам огромную гибкость.

Эпилог

Автомобиль все еще раскачивался на ветру, а пламя свечи танцевало и дрожало на фитиле. И тут типичная ошибка - сохранение только в файл на локальном диске будет приемлемо для наших пользователей.

Все черные тени в машине тоже дрожали, идеально синхронизировавшись с пламенем. Сохранение непосредственно на Google Диск, Dropbox, OneDrive или у любого другого поставщика в настоящее время де-факто является стандартом.

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

Visual Studio предстала передо мной. Если я немного подумаю, гибкий подключаемый конвейер немедленно покроет все возможные будущие требования.

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

public ActionResult ExportSubscriberEmails(GetSubscribersQuery query)
{
    var emails = QueryExecutor
        .Execute(query)
        .Select(subscriber => subscriber.Email);

    return new FileStreamResult
    (
        new MemoryStream
        (
            Encoding.UTF8.GetBytes(string.Join(Environment.NewLine, emails))
        ),
        "application/csv"
    )
    {
        FileDownloadName = string.Format
        (
            "Subscribers exported on {0}.csv",
            TimeGenerator.GetToday().ToString("yyyy.MM.dd")
        )
    };
}

На улице было темно и завывал ветер.

За кулисами короткометражка

Пейзаж шторма взят из последних нескольких абзацев романа Ким Стэнли Робинсон - История двадцатого века с иллюстрациями. Это один из моих любимых научно-фантастических романов.

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

И поворот в самом конце романа одинаково идеально сочетается с моим поворотом в конце этих безумных двадцати минут. Потратив драгоценное время на набросок решения для Предвиденного - чего-то, в чем никто не нуждался и о котором никто не просил - я нашел смелость не реализовывать его. Я сел и буквально через пару минут написал «Единственное, что нужно писать». То же, что и герой романа в конце романа.

Я победил себя.

Удаленные сцены с пола монтажной

Мартин Фаулер написал хорошую статью о ЯГНИ.

You Arent Gonna Need It на c2.com - идеальное место для получения дополнительной информации и обзоров, а также ссылок на многочисленные связанные темы.

Но в конце концов, это все теория :-) Освоение ЯГНИ - это, по крайней мере, для меня постоянное упражнение в самоконтроле. Сказать «Нет!» Совсем не просто. ко всем тем интересным функциям, которые могут понадобиться однажды.

Первоначально опубликовано на сайте thehumbleprogrammer.com 1 июня 2015 г.