TL; DR: это зависит от того, что вы пытаетесь решить.
У меня был похожий разговор с моими Gramps об этом, когда мы говорили о том, как Func и Action в C # замечательны. My Gramps - очень старый программист таймера, он работал с исходными кодами с тех пор, как программное обеспечение запускалось на компьютерах, занимающих целую комнату.
Он несколько раз менял техников в своей жизни. Он написал код на C, COBOL, Pascal, BASIC, Fortran, Smalltalk, Java и в конце концов начал C # в качестве хобби. Я научился программировать с ним, сидя у него на коленях, пока я был просто придурком, вырезая мои первые строки кода на синем редакторе IBM SideKick. К 20 годам я уже потратил больше времени на программирование, чем на игры на улице.
Это немного моих воспоминаний, так что извините, если я не совсем практичен, пересказывая их. Я немного люблю эти моменты.
Вот что он сказал мне:
«Должны ли мы пойти на обобщение проблемы или решить ее в конкретной области, вы спрашиваете? Ну, это ... вопрос».
Грэмпс сделал паузу, чтобы немного подумать об этом, фиксируя положение очков на лице. Он играл в матч-3 на своем компьютере, слушая LP Deep Purple на своей старой звуковой системе.
«Ну, это будет зависеть от того, какую проблему вы пытаетесь решить», - сказал он мне. «Соблазнительно полагать, что существует единственное, святое решение для всех вариантов дизайна, но его нет. Видите ли, архитектура программного обеспечения подобна сыру».
"... Сыр, Gramps?"
«Не имеет значения, что вы думаете о своем любимом, всегда найдется кто-то, кто думает, что это вонючий».
Я моргнул в замешательстве, но прежде чем я успел что-то сказать, продолжал Грэмпс.
«Когда вы строите машину, как вы выбираете материал для детали?»
«Я ... я полагаю, это зависит от затрат и того, что часть должна делать, я полагаю».
«Это зависит от проблемы, которую пытается решить деталь. Вы не будете делать шину из стали или ветровое стекло из кожи. Вы выбираете материал, который наилучшим образом решает проблему, с которой вы столкнулись. универсальное решение? Или конкретное? К какой проблеме, к какому варианту использования? Следует ли использовать полнофункциональный подход, чтобы обеспечить максимальную гибкость кода, который будет использоваться только один раз? Следует ли писать очень специализированный, хрупкий код для часть вашей системы, которая будет видеть множество вариантов использования и, возможно, множество изменений? Варианты дизайна, подобные этим, подобны материалам, которые вы выбираете для детали в автомобиле, или форме кирпича Lego, который вы выбираете, чтобы построить маленький дом. Какой кирпич Lego самый лучший?
Пожилой программист потянулся к маленькой модели поезда Lego, которую у него на столе, прежде чем продолжить.
«Вы можете ответить на этот вопрос, только если знаете, для чего вам нужен этот кирпич. Как, черт возьми, вы узнаете, что конкретное решение лучше общего, или наоборот, если вы даже не знаете, с какой проблемой вы работаете? пытаясь решить? Вы не можете увидеть прошлый выбор, который вы не понимаете ".
"... Вы только что процитировали Матрицу? "
"Какая?"
«Ничего, продолжай».
«Ну, предположим, вы пытаетесь что-то встроить в Национальную систему счетов. Вы знаете, как этот адский API и его XML-файл из тридцати тысяч строк выглядят изнутри. Как бы выглядело« универсальное »решение для создания этого файла? как? Файл полон необязательных параметров, полных случаев, которые должны использовать только очень специфические отрасли бизнеса. В большинстве случаев их можно спокойно игнорировать. Вам не нужно создавать общую систему счетов, если это единственное, что у вас есть » Вы когда-нибудь будете продавать обувь. Просто создайте систему продажи обуви и сделайте ее самой лучшей в мире системой счетов-фактур по продаже обуви. Теперь, если вам нужно было создать систему счетов-фактур для любого типа клиента, для более широкого применения - быть перепроданным как независимая, общая система продаж,например - сейчас интересно реализовать те варианты, которые используются только для газа, еды или алкоголя.Теперь это возможные варианты использования. Раньше они были просто гипотетическими. Не используйте случаи, и вы не хотите реализовывать Не используйте случаи. Не используйте это младший брат Не нужно ".
Грэмпс вернул лего-поезд на свое место и вернулся к своей игре «три в ряд».
«Таким образом, чтобы иметь возможность выбрать общее или конкретное решение для данной проблемы, вам сначала нужно понять, что, черт возьми, эта проблема. В противном случае вы просто угадываете, и угадываете работу менеджеров, а не программистов. все в ЭТОМ, это зависит ".
Итак, вот оно. "По-разному". Это, наверное, самое мощное выражение из двух слов, когда мы думаем о разработке программного обеспечения.