Почему я ненавижу фреймворки

http://discuss.joelonsoftware.com/default.asp?joel.3.219431
  • Перевод
Я собираюсь сделать Java-веб-приложение (да, это будет Java, по некоторым причинам, которые сейчас озвучивать не хочу). В процессе работы, я оцениваю кучу J2EE portlet-enabled JSR-compliant MVC role-based CMS web service application container фреймворков.

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

Давайте представим, что я решил сделать шкафчик для специй.

Я уже делал небольшие поделки из дерева и думаю, что знаю, что мне нужно: немного дощечек и несколько базовых инструментов: рулетка, пила, уровень и молоток.

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

Итак, я иду в магазин за инструментами и спрашиваю продавца, где я могу найти молоток.

— Молоток? — спросил он. — Никто уже давно не покупает молотки. Это старомодно.

Я был очень удивлен и спросил почему.

— Ну, проблема молотков в том, что их очень много видов. Кувалды, столярные молотки, с круглым бойком и т.д. Что если Вы купите один тип молотка, а потом поймете, что Вам нужен другой? Вам придется покупать отдельный молоток для следующей задачи. Как выяснилось, большинство людей хотят иметь один молоток, который бы справлялся со всеми типами задач, с которыми можно столкнуться.

— Хммммм. Ну, звучит разумно. Можете показать мне такой Универсальный Молоток?

— Нет. Мы их больше не продаем. Они устарели.

— Серьезно? С Ваших слов я понял, что Универсальный Молоток – это технология будущего.

— Как выяснилось, если сделать только один тип молотка, способный выполнять те же задачи, что и все виды молотков, тогда он будет не очень хорош для каждой из них. Забивать гвозди кувалдой не очень эффективно. И если Вы хотите убить свою бывшую девушку, то ничто не заменит молотка с круглым бойком.

— Верно. Но если никто больше не покупает Универсальные Молотки и если Вы больше не продаете все старомодные типы молотков, то какие же молотки Вы продаете?

— Вообще-то, мы не продаем никакие молотки.

— Но…

— Наши исследования показали, что людям совсем не нужен Универсальный Молоток. Всегда лучше использовать нужный тип молотка для работы. Поэтому, мы начали продавать фабрики молотков, способные создать любой молоток, какой Вам нужен. Все что Вам нужно — это укомплектовать фабрику рабочими, запустить механизм, купить сырье, оплатить расходы и — БАЦ — у Вас есть именно такой молоток, какой Вам нужен.

— Но мне как-то не хочется покупать фабрику молотков…

— Это хорошо. Потому что мы их больше не продаем.

— Но Вы же только что сказали…

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

— Да, похоже на то.

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

— Дайте угадаю. Вы их больше не продаете.

— Нет. Конечно же нет. Как выяснилось, люди не хотят строить целую фабрику, только ради того, чтоб произвести пару молотков. Оставьте строительство профессионалам, вот что я всегда говорю.

— И здесь я с вами соглашусь.

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

— Ну, это как-бы, не совсем…

— Я знаю что Вы скажете! Мы их уже больше не продаем. По каким-то причинам, довольно мало людей покупали фабрики фабрик молотков, поэтому мы придумали новое решение проблемы.

— Угу.

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

— Да. Это уж точно.

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

— Так у вас нет никаких молотков? Совсем никаких?

— Нет. Если Вы по-настоящему хотите высококачественный, промышленно разработанный шкафчик для специй, вам нужно нечто более продвинутое, нежели обычный молоток из магазина.

— И что, все сейчас так делают? Все используют единую фабрику фабрик фабрик инструментов, всякий раз, когда им нужен молоток?

— Да.

— Ладно… Я кажется понял, что мне нужно делать. Если сейчас это делается таким образом, будет, наверное, лучше и мне научиться так делать.

— Очень хорошо!

— Эта вещь идет с документацией, верно?
Метки:
Поделиться публикацией
Комментарии 239
  • +114
    Напомнило «Казалось бы, зачем убийце убивать убийцу убийцы, но Донцову уже было не остановить… ».

    мы представим единую фабрику фабрик фабрик инструментов


    Просто гениально. Вроде хороводоводоведофилофобы.
    • +36
      теперь я понял, кто стоит за тенденциями в современном программировании — Донцова :)
      • +2
        Знаете, порой в книгах донцовой больше оригинальности и разумного полета мысли чем в программных проектах…
        • +7
          Скажем так, чуть больше.
          • 0
            Вы хотите сказать что вы ЧИТАЛИ книги Донцовой? Срочно, СРОЧНО чистить чакры! :-()
            • 0
              Что вы, что вы =) Один раз просто ввиду невероятной скуки в транспорте уставился в книгу, которую читала соседка по несчастью. В общем одной страницы хватило %)
          • +1
            кто стоит за тенденциями в современном программировании

            штампы и негры
            • –4
              не могу лайкать из за кармы, но +100500 )))
          • +8
            Если брать J2EE как сущность в целом, то оно давно уже стало нечто монстроподобным. Оттуда можно брать только отдельные технологии. Для большинства приложений достаточно веб-контейнера (Tomcat, например) и для удобства как надстройку над сервлетами ещё какой-нибудь маршрутизирующе-темплейтный движок.
            • +16
              Остается только 1 вопрос: «Почему вы ненавидите фреймворки?»
              • +23
                За что минисуем господа? Я просто совсем не понял о чем пост, почему автор против фреймворкоа и как это аргументирует?
                Когда стоит задача написать более-менее нормальное веб приложение, он его берет и с нуля пишет? А потом борется с союственными косяками, объясняет всем членам команды как оно работает, ибо документации конечно нет и так далее?
                Или он хочет написать приложение которое принимает на вход картинку а выдает отресайзенный вариант и жалуется, что в фреймворке много лишнего?

                Или он пишет приложение без hibernate, spring или jboss и сам с нуля пишет их функционал?

                Мне кажется что статья глупая и не обоснованная! Атор или неправильно выбирает инструменты для задачи или неправильно понимает задачу или просто ему не хватает опыта и знаний.
                • +13
                  зачем вы столь серьёзны? это же шутка
                  • +1
                    Ага. Типа «Ну это мы вам просто в шутку слили карму почти в ноль» :)
                  • +71
                    Мы бы ответили на ваш вопрос. Но мы убедились, что стандартные ответы на вопросы не всегда работают, ведь каждому хабраюзеру нужен свой собственный вариант ответа на вопрос. Вместо этого мы хотели предложить вам универсальный конструктор ответов на вопросы, но хабраюзерам как правило лень пользоваться такими конструкторами либо же находятся другие субъективные причины. Вместо этого мы используем универсальную абстракцию ответа на вопрос, реализованную с помощью новейших браузерных технологий. Теперь нужно всего лишь нажать на кнопку, что вызовет изменение цифры в базе данных, что в свою очередь станет началом цепочки умозаключений, которую проделает ваш мозг самостоятельно в присущей ему индивидуальной манере.
                    • 0
                      Ровно через неделю окажется, что абстракции не всегда работают, потому что не каждый хабраюзер способен производить цепочку умозаключений, которую должны подразумевать абстракции. Посему хитом следующей недели станет хаотичная система функций, генерирующая абстракции ответа на вопрос, позволяя максимально автоматизировать процесс формирования цепочки умозаключений, которую ваш мозг конечно же проделает с присущей индивидуальной манерой, но с посеянным зерном сомнений. Торопитесь, наверняка тираж таких систем будет ограничен!
                  • +3
                    Говорила мне мама: «Никогда не пользуйся чужими программами. Тебе что, своих багов мало?»
                  • +2
                    я тоже
                    • +22
                      > «J2EE portlet-enabled JSR-compliant MVC role-based CMS web service application container фреймворков»

                      1. Разобрать кашу в голове
                      2. Выбрать технологию
                      3.…
                      4. PROFIT!
                      • +3
                        Это очень в кассу к JAVA, на самом деле.
                      • +10
                        это и отличает наверное новичка от опытного разработчика…
                      • +46
                        У меня другой вопрос. За что вы так не любите девушек (пусть даже бывших)? :(
                        • +78
                          Они так мерзко кричат, так грязно брызгают кровищщей, так жалко пытаются уползти, когда наконец загонишь им в башку молоток с круглым бойком. (А может, ледоруб.) Фу, гадость. Нет ничего хуже бывших девушек.
                          • +31
                            На всякий случай поясню, что это не моё мнение, а моя попытка проникнуть во вкусы автора первоисточника блогозаписи.
                            • +3
                              Вспомнился Ганнибал. Мда. Хотя лучше писать, чем делать. Здоровья вам.
                              • –1
                                «What if I were to cut you up and mail each part
                                to a different town? It would take the most
                                brilliant private eye the rest of his life
                                just to put you together.
                                a piece in each mailbox all over the planet
                                from Moscow to Tokyo to Guadalajara.»
                                prostopleer.com/tracks/4533126fjPk
                            • +4
                              Я тоже ненавижу фреймворки.

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

                              Или другой пример: возьмём opensource медиа-сервер RED5 и посмотрим на его составные части. Среди прочего, мы увидим всякие страшные и нафиг не нужные вещи вида spring application framework, библиотеки для логгинга, библиотеки для ввода/вывода, библиотеку HTTP-сервера и так далее. В результате получается монструозное нечто, запускающееся минуту и при ошибках выдающее километровые stack trace. А ведь если бы фреймворки не использовали, оно работало бы быстрее, было бы менее требовательно к ресурсам и разработка стала бы проще.

                              Упрощайте.
                              • +9
                                >А ведь если бы фреймворки не использовали, оно работало бы быстрее, было бы менее требовательно к ресурсам и разработка стала бы проще.

                                Угу. Только тогда вам пришлось бы написать вдобавок к своей аппликухе не только сам медиа-сервер, но и HTTP-контейнер к нему (а как он будет работать без этого?). Ну, и в процессе бы выяснилось, что логгинг туда тоже не мешало бы прикрутить, да и без библиотеки ввода-вывода ни куда… :)
                                • –7
                                  Нафига HTTP-контейнер RTMP-серверу, если для этого придуманы веб-сервера? Зачем специальная библиотека для логгинга, если можно обойтись одним классом, который пишется за две минуты, или вообще System.out.println()?
                                  • +3
                                    > System.out.println()?
                                    А я хочу вырубить логирование в этой библиотеки, чтобы оно мне спамило консоль. Или перенаправить вывод именно этой библиотеки в определённый файл.
                                    • +2
                                      >> можно обойтись одним классом, который пишется за две минуты
                                      • +7
                                        Зачем, если можно взять уже написанный класс?
                                        • +2
                                          new LoggerHandlerFabricFabric.getFabric().fabric().addLogListener(new ListenerFabricFabric.getFabric().fabric())
                                          • +1
                                            Это там так есть или Вы сами придумали?
                                    • +4
                                      Мало ли зачем может понадобиться HTTP-контейнер RTMP-серверу на Java:)
                                      Например, для веб-консоли или купертино-стримминга.

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

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

                                      Но
                                      [...] можно обойтись одним классом, который пишется за две минуты, или вообще System.out.println()?

                                      В случае одноразового ПО такой подход имеет право на существование, но пожалуйста, никогда не пишите серверный софт.
                                      • +1
                                        В случае серверного софта
                                        >> можно обойтись одним классом, который пишется за две минуты
                                        В этом классе можно реализовать уровни и тэги, например. А больше ничего и не надо.
                                        Что касается System.out.println() — да, в чистом виде в больших проектах не особо применим.
                                        • +1
                                          Уровни, конфигурацию, стримы. Потом отлавливать дедлоки, сделать фабрику логгеров, оптимизировать шаблоны вывода. Все Можно)
                                          • +3
                                            Я к тому что все это можно. Но лучше все-таки взять slf4j и наконец-то сконцентрироваться на бизнес-логике. Главное – задача, инструмент – вторичен.
                                      • +1
                                        В единичном случае это так. Но когда вы написали один класс за 5 минут, второй за 5 минут, третий и т.д. И когда возникает потребность что-то поправить в проекте, вот тогда вы поменяете свое мнение. А если не возникнет то и не поменяете. И в данном случае это будет лучшим решением.
                                        Спорить тут бессмысленно. Если то что вы делаете полностью вас устраивает, думаю не стоит что-то менять. Лично меня никогда не устраивает мой результат работы.
                                        • +2
                                          >Нафига HTTP-контейнер RTMP-серверу, если для этого придуманы веб-сервера?

                                          И протокол ЦГИ, что ли? Да, помню, лихие 90-е, cgi и скрипты на пёрле :).

                                          >Зачем специальная библиотека для логгинга, если можно обойтись одним классом, который пишется за две минуты, или вообще System.out.println()?

                                          Очевидно, для удобства. Ещё более очевидно — для мирного сосуществования с окружающей средой и единого места конфигурации. Чуть менее очевидно — для работы в многопоточном окружении, например.

                                          Да, ничего этого не надо, если у вас наколенная аппликуха для раздачи хомпорн трём вашим друзьям. А когда часть большой системы, в которой каждая тварь конфигурит тот же логгинг в стопиццот разных местах стопиццот разными способами…
                                      • +1
                                        Не джавой единой )
                                        Посмотрите на Django/Ror. В первой так вообще чтобы какая-то новая фича попала в состав фреймворка должно произойти что-то невообразимое.
                                        • +9
                                          Зашел в топик чтобы увидеть комментарий про RoR.
                                          • +1
                                            Микрофреймворки еще.
                                            • +1
                                              Ну они по умолчанию минимальны )
                                          • +9
                                            KISS всем посоны!!!
                                          • +50
                                            … потом он идёт на рынок, где добрый дед таки продаёт ему молоток. Всё просто замечательно: ничего не надо конфигурировать, изучать — бей, пили, строгай. Через день шкафчик готов. А ещё через день в шкафчике отваливается дверь. Профессиональные молотки, конечно же, уже работают с другими гвоздями, от которых она не отваливается, но их пока настроишь, пока запустишь… сто лет пройдёт: лучше по старинке. И дверь прибивается гвоздями или приклеивается.
                                            Потом получается так, что в шкафчике надо сделать ещё одну секцию. Она делается, но случайно весь шкафичик разваливается. Вот этим новым людям, с новыми навороченными молотками, — думает хозяин — ничего этого знать не надо, там всё это продумано, но как же это сложно сконфигурировать — нет, починю старый. После чего шкафичк восстаёт из обломков — склеенный и замотанный синей изолентой. Чтоб не развалился.
                                            А ещё чуть погодя хозяин уезжает. И шкафичик у нового человека случайно, когда тот потянул его не за ту ручку, разваливается. Его относят на помойку, покупают профессиональный молоток и заменяют новым шкафчиком — с которым просто.
                                            • +92
                                              Вы что-то перепутали… Вещи обмотаные синей изолентой вообще не разваливаются!
                                              • +4
                                                Надо срочно послать несколько тысяч контейнеров синей изоленты в евросоюз.
                                                • +5
                                                  И в Китай пожалуйста отправьте
                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                              • +4
                                                А еще вы забыли, что профессиональные молотки уже не продаются :)
                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                  • 0
                                                    Ну да. Наш народ уже продает их по переходам и в метро :)
                                                • +5
                                                  Если человек не умеет орудовать молотком, не понимает, как устроен шкафчик, то ему и не стоит его делать, лучше купить готовый. Если он хороший менеджер и сумеет управиться с этой махиной фабрик, то он так и должен сделать.

                                                  А на деле, всё должно зависеть от масштабов проекта, именно поэтому, в реальной жизни, молотки продаются.
                                                  • +3
                                                    >с которым просто
                                                    С которым просто текущему хозяину. А потом он тоже уезжает, приходит новый, видит этот шкафчик и думает: «А вдруг он развалится, если я его потяну не за ту ручку — такое у меня уже бывало, больше не хочу. Выкину ка я его лучше сейчас, и поставлю свой, в котором я точно знаю за какие ручки тянуть»
                                                    • +1
                                                      Вообще-то, ни одна крайность не есть хорошо. Но тут я согласен — если что-то может привести к усложнению в неумелых руках, это не значит, что нужно зарубить паттерн на корню. Пример со шкафчиком, возможно, не самый удачный. Все-таки, молотка действительно может и хватить, а фабрика фабрик фабрик молотков явно лишняя.
                                                      • +1
                                                        Конечно же, меру надо знать во всём. Я не за тотальное использование фреймворков во всех местах, я против «фи, фреймворк!» с последующим написанием тоже фреймворка, но самописного, «более простого», с кучей багов.
                                                        • +1
                                                          Согласен на все сто. И зачастую после заявлений автора «да я и сам могу» и «да можно в сто раз проще свое забубенить» самописный получается даже не «фреймворк», а куча какого-то неразборчивого спагеттини.
                                                      • +1
                                                        У кого есть голова и руки делают хороший шкафчик обычными инструментами.
                                                        У кого этого нет, приходится пользоваться фабрикой фабрик.
                                                      • +6
                                                        фреймворки тут непричем.
                                                        речь идёт про DI и IoC — а они используются не во всех фреймворках.
                                                        • +91
                                                          Еще вспомнилась картинка про MVC:
                                                        • +2
                                                          И причем тут IoC и DI?
                                                          • 0
                                                            В принципе, любой фреймворк и есть IoC. А DI — частный случай IoC.
                                                            • 0
                                                              «любой фреймворк и есть IoC»

                                                              Поясните мысль?
                                                              • 0
                                                                Лучше всего мою мысль пояснит цитата:
                                                                Одной важной характеристикой фреймворка является то, что методы, определенные пользователем для адаптации фреймворка под свои нужды, будут чаще всего вызываться внутри самого же фреймворка, а не из кода приложения пользователя. Фреймворк часто играет роль главной программы в координации и последовательности действий приложения. Такая инверсия управления дает фреймворку возможность служить расширяемым скелетом приложения. Методы, предоставляемые пользователем, адаптируют общие алгоритмы, определенные фреймворком, под определенное приложение.

                                                                Ральф Джонсон и Брайан Фут.
                                                                • +1
                                                                  Без умных слов, попробую. Типичны два варианта непосредственного использования стороннего (для проекта) кода: библиотеки и фреймворки (про копипаст замнём для ясности). Существенная, имхо, разница в контроле со стороны разработчика над потоком выполнения — с библиотеками мы запускаем свой код, вызывающий код библиотеки, когда сочтём нужным, а с фреймворками мы запускаем код фреймворка, который вызывает наш код, когда сочтёт нужным. Во втором случае мы можем только намекнуть ему, что хотим в такой-то ситуации получить управление — «магия», соглашения, конфиги. и т. п.

                                                                  Правда с этой точки зрения большинство популярных фреймворков являются «2-в-1» — есть как каркас приложения, который вызывает наш код, так и обычная библиотека, код которой мы вызываем. Ещё больше запутывает то, что вызываемый код библиотеки может тоже вызывать наш код — например, библиотека с использованием колбеков- такие библиотеки отчасти тоже можно считать фреймворками.
                                                                  • 0
                                                                    С этим я не спорю и полностью согласен. Сам проектировал несколько специализированных фреймворков и работал со многими.

                                                                    Но я бы ни за что не стал утверждать, что «Framework = IoC». Во-первых, это может быть не так, а во-вторых, IoC, как архитектурный подход, все же, более конкретен, чем определение фреймворка. Фреймворк может использовать конкретные приемы/паттерны, или концепцию IoC для своего «control flow», а может не использовать. В частности, фреймворк отнюдь не обязательно уменьшит связанность между компонентами (основная задача IoC), а скорее задаст некоторое «направление» приложению.

                                                                    Так что, на мой взгляд, это совершенно разные вещи.
                                                                    • 0
                                                                      По-моему тут IoC имелся в виду не как паттерн, а как принцип работы фреймворка в целом. Просто если не фреймворк вызывает наш код, а мы вызываем его, то в чём его отличие от библиотеки? Плюс, субъективно далеко не всё, что называется (авторами или сообществом — не суть) фреймворком им на самом деле является.
                                                                      • 0
                                                                        Я говорю лишь о том, что все это должно включать/уже включает само определение «фреймворка». IoC как термин тут ни при чем.
                                                                        • 0
                                                                          Не для всех очевидно, что оно включает.
                                                            • +2
                                                              >мы представим единую фабрику фабрик фабрик инструментов

                                                              Я могу ошибаться, но такой маразм типичен в первую очередь для Java. За время моего знакомства с ней (к счастьюсожалению, впрочем, довольно краткого), мне хватило, например, этого маразма.

                                                              • 0
                                                                Не осилил DocumentBuilderFactory? Печаль.
                                                                • 0
                                                                  Что там осваивать? Не монады в Хаскелле поди.
                                                                  Сам факт что это реализовано таким…… ТАКИМ способом (а судя по ответам на мой коммент, это ещё и в порядке вещей в этом языке), вызывает грусть, печаль, уныние и снижение валового продукта в стране.
                                                                  • 0
                                                                    Так именно же — осваивать нечего, всё просто.
                                                                    Вас Factory pattern пугает?
                                                                    • 0
                                                                      >Вас Factory pattern пугает?
                                                                      Он меня не пугает. Он у меня вызывает раздражение. (То же самое, судя по всему, можно сказать и о авторе данного топика, к слову).
                                                                      • 0
                                                                        Я вам сочувствую, но это ваша проблема.
                                                                        Ничего плохого в Factory паттерне нет. А пост, между прочим, шуточный (-:

                                                                        Конкретной в данной ветке комментариев речь идёт не вообще о бесконечном громождении Factory of Factory of Factory каком-то, а о DocumentBuilderFactory конкретно. И в случае с DocumentBuilderFactory никакого громождения нет, нет мета-уровня над DocumentBuilderFactory.

                                                                        И пусть в некотороых случаях есть мета-уровень когда есть Factory of Factory, но есть ли в этом смысл — нужно разбираться в каждом конкретном случае.

                                                                        Паттерны ООП это _хорошо_, если вам не нравятся паттерны, а значит, видимо, и ООП, это ваше личное горе, и никак иначе.
                                                                        • 0
                                                                          >Паттерны ООП это _хорошо_, если вам не нравятся паттерны, а значит, видимо, и ООП, это ваше личное горе, и никак иначе.
                                                                          Я долго думал, как на это ответить.

                                                                          Так вот. Я не имею ничего против ООП.
                                                                          Когда его использование оправдано.

                                                                          Я могу понять объектную реализацию дерева DOM, создаваемого парсером XML.
                                                                          Мне трудно понять, зачем нужно создавать объект DocumentBuilder, практически единственной функцией которого и является парсинг XML — документа. Вы меня извините, я может быть чего то не понимаю, но по-моему, в docs.oracle.com/javase/1.4.2/docs/api/javax/xml/parsers/DocumentBuilder.html — всё, кроме разве что getDOMImplementation() можно засунуть в вызов единственной функции с перегрузками под разные источники входящих данных (последнее — оковы статической типизации, что уж поделать).
                                                                          Но смысл существования DocumentBuilderFactory — класса, который нужен только и единственно затем чтобы его инстанциировать и плодить (ненужные) объекты DocumentBuilder, присыпая их разными конфигурационными параметрами самого создаваемого парсера, я осознать не могу.
                                                                          Точнее нет. Я могу. Я сочувствую работникам IT-отрасли индийского происхождения, которым платят за SLOC. Этот язык, с его идеологией, в принципе является инструментом, благотворным для них.
                                                                          • 0
                                                                            OMG

                                                                            Фабрика здесь для того, чтоб отделить создание конкретной реализации от интерфейса, ибо DocumetnBuilder это интерфейс, а имплементации у него разные. Вы вообще в курсе зачем Factory паттерн нужен?

                                                                            И потом, DocumentBuilder-ы они не thread safe, и поэтому нельзя создать один и юзать его в хвост и в гриву, или засунуть эту не thread-safe функциональность «в вызов единственной функции», которая статическая должна быть видимо, и пользовать одну функцию на всё.

                                                                            Если вы скажете «нафиг ООП» и засунете логику парсания в одну статик функцию, вы не сможете например подменять имплементации этой функции для unit-тестирования. И если уж вы пишете на объектно ориентированном языке программирования, то к чёрту 100500 статических функций — пишите нормально, с объектной моделью.

                                                                            Если же вам процедурное программирование мило, а ООП — зло, вам пора в машину времени и в 80-е.

                                                                            > Я сочувствую работникам IT-отрасли индийского происхождения
                                                                            А я сочувствую вам.
                                                                          • 0
                                                                            А пост, между прочим, шуточный (-:

                                                                            В каждой шутке есть доля… шутки.
                                                                • 0
                                                                  А мне статья напомнила эту habrahabr.ru/post/139535/, делая акцент на универсиализации (да простит меня русский язык).
                                                                  • +4
                                                                    Вы сделали мой день.
                                                                    • +49
                                                                      Вы сломали мой русский мозг.
                                                                      • 0
                                                                        Насколько я понял, имелось ввиду выражение «Make my day»
                                                                        • +38
                                                                          • +1
                                                                            Сарказм засчитан. Просто вы поздно пришли — тут товарища DeusModus сначала стали минусовать, видимо по незнанию зарубежных мемов — я просто пояснил.
                                                                        • +5
                                                                          Это такая же смешная шутка как «Имей хороший день» %)
                                                                          • 0
                                                                            Трудности перевода, простите :)
                                                                            • 0
                                                                              и не русский тоже
                                                                          • –1
                                                                            Если автор ненавидит фреймворки, его никто не заставляет их использовать.
                                                                            Он всегда может написать свой фреймворк, и убедить всех, что этот фреймворк гениален, ведь решает только нужные автору задачи.
                                                                            • +3
                                                                              Вот именно, он будет решать только нужные автору задачи, это не модно — нужно создавать фреймворк для построения фреймворков которые будут решать нужную задачу, но поскольку очень обременительно создавать по фреймворку для создания фреймворков под определенный круг задач, стоит озаботится созданием одного универсального фреймворка для создания фреймворков для создания фреймворков под определенный круг задач.
                                                                              • +5
                                                                                Язык программирования — это и есть универсальный фреймворк для создания фреймворков для создания фреймворков под определённый круг задач.
                                                                                Впрочем, всегда остаётся возможность написания своего собственного языка программирования (с блэкджеком и указателями) для написания своих собственных языков для создания универсальных фреймворков… ну в общем, вы поняли.
                                                                              • 0
                                                                                И назвать его «Молоток».
                                                                              • +5
                                                                                Фреймворк фреймворку рознь. Взять, к примеру, Django — пять лет назад я впервые прошел по ней туториал и сделал гостевую книгу. Если проделать те же шаги сейчас, с самым последним транком, мы получим ту же гостевую книгу. Это отличный пример того, как фреймворк с годами обрастает фичами, не превращаясь в непонятного монстра, напичканного уймой разных модных технологий.
                                                                                Как сказали выше, не нужно впадать в крайности.
                                                                                • +1
                                                                                  А мне по этой же причине CodeIgniter на PHP нравится, вот просто по-человечески нравится. Да, я знаю про все его недостатки, но зато в нем можно взять только то, что нужно тебе, и сделать на базе этого что-то быстрое и чистое.
                                                                                  • 0
                                                                                    Согласен!
                                                                                    Можно ссылочки почитать про недостатки?
                                                                                    • 0
                                                                                      Недостаток — в его критике, коей довольно много. Из-за этого новички трижды подумают, прежде чем его изучать. А это отрицательно сказывается на его развитии и продаваемости решений на нём.
                                                                                      • 0
                                                                                        Чистую правду сказал ainu, основной недостаток — чересчур критичное отношение к нему сообщества. Разработчики вообще очень критичны к тому, что отлично от привычных им инструментов. Про недостатки конкретных слов найти сложно, в основном пеняли всегда за тяжелое наследие пхп4, несколько нестандартную модель ооп, отсутствие некоторых жизненно необходимых некоторым людям модулей… Ну и за неповоротливость в развитии, но как по мне, так сами критиканы в этом и виноваты, что народ отпугивают.
                                                                                    • 0
                                                                                      Да, с рельсой такое не пройдет, и меня это огорчает :(
                                                                                    • +7
                                                                                      Ощущения от фреймворков автор передал просто шикарно.
                                                                                      • +2
                                                                                        браво!

                                                                                        п.с. не все фреймворки, правда, настолько плохие. имхо.
                                                                                        • +29
                                                                                          Даа, любую проблему можно решить путём введения дополнительного уровня абстракции… :)
                                                                                          • +12
                                                                                            Умнгу, дальше остается только решить проблему возросшего количества уровней абстракции. Которую мы решим введением еще одного уровня абстракции. Whait… oh, shi…
                                                                                            • 0
                                                                                              Лучше решать проблемы по-старинке. Вместо добавления абстракции напишем еще один скрипт, который будет решать конкретную проблему. Это вполне будет работать, пока не столкнемся с проблемой возросшего количества скриптов.
                                                                                          • +1
                                                                                            Текстик старенький, конечно, но…

                                                                                            Классика бессмертна.

                                                                                            P.S. Блин, где же я видел этот текст? Точно же помню, что видел. Гугл подводит.
                                                                                            • +2
                                                                                              Там ссылка внизу
                                                                                              • +2
                                                                                                Тьфу ты, опять не заметил, что перевод. Х)

                                                                                                И пришлось распарсить страницу, чтобы найти ссылку на оригинал, потому что в упор её не видел. Ну какой гений догадался запихивать ссылку на оригинал в неприметную плашку мелким шрифтом…
                                                                                            • –9
                                                                                              Спасибо за небольшое освещение проблемы фреймворков!
                                                                                              … не зря интуиция подсказывала мне — писать собственный: и документация всегда в голове, и архитектура — как на ладони, а отсюда — гибкость.

                                                                                              … однако, перевод достаточно грубоват: не стоит уничтожать глаза, да и девушки не виноваты. Хоть это и было в оригинале.
                                                                                              • +2
                                                                                                Документация всегда в вашей голове! Много ли сейчас проектов пишет разработчик соло?
                                                                                                К тому же, код, написанный год тому назад, не узнаваем сегодня.
                                                                                                • 0
                                                                                                  Doxygen и аналоги никто не отменял. И через год — вспомнится.
                                                                                                  По поводу статистики по разработчикам — не интересовался. Я лично пишу несколько.

                                                                                                  … и высказал в комментарии выше — лишь своё субъективное мнение, никому вовсе не навязываемое.
                                                                                                  • +1
                                                                                                    Своё мнение можно высказать на литературном форуме, а здесь всё же обсуждаются более-менее конкретные вещи
                                                                                              • +4
                                                                                                Актуально, если вам нужен всего один шкафчик. А если вы продаете их клиентам.

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

                                                                                                А потом другой клиент говорит: «А я хочу такой же вот, только на колесиках». Вы идете опять в магазин и покупаете новый инструмент и задумываетесь, не лучше было бы с самого начала фабрику инструментов купить?
                                                                                                • +7
                                                                                                  Хотя… Их же тоже уже не продают… :(
                                                                                                • +8
                                                                                                  Никто не заставляет использовать фреймворки. Напишите CGI приложение и подключите его к Apache/IIS/… Правда по некоторым квалификациям тут уже веб-сервер будет выполнять роль фреймворка. Значит просто пишем демон, слушающий сокет на 80м- порту и обрабатывающий HTTP по всем спецификациям. Для очистки совести можно перед ним повесить прокси-сервер, обрабатывающий статику. Или даже преобразующий HTTP-запрос в запрос FastCGI/WSGI/SCGI…

                                                                                                  Я пробовал такой путь на Java/C#/Python/Ruby/Erlang — муторно, но даёт ответ на вопрос зачем нужны фреймворки: чтобы не писать самому циклы обработки сокетов и преобразования приходящих в сокет данных в структуры данных ЯП, последовательности вызовов обработчиков и преобразование результата в виде структур в ответ, отсылаемый по сокету. А дальше уже вопрос выбора конкретного фреймворка — насколько сильное преобразование вам нужно. Может достаточно преобразования HTTP в массив/хэш, а может нужен разбор параметров и гибкая диспетчеризация, плюс архитектура MVC, кэширование, скафоолдин и прочее.
                                                                                                  • +8
                                                                                                    Знакомая ситуация :)
                                                                                                    Может получиться так, что пока Петя искал фабрики фрэймворков фабрик на Java, конкурент Вася слепил за неделю веб-приложение на PHP, которое работает медленно, содержит баги, имеет только 50% от функционала, состоит из говнокода чуть менее, чем полностью, яваскрипт перемежается в нём эскуэлем, и будущие программисты вынужденные добавлять новый функционал проклянут Васю и перепишут приложение пару раз с нуля.
                                                                                                    Но оно уже работает и приносит деньги :)
                                                                                                    • +7
                                                                                                      Только его не Вася зовут, а так да, приносит деньги.
                                                                                                      • +5
                                                                                                        Ага, только тормозит, пользователи плюются, фичи добавляются медленно и ломают старые, а когда появляется конкурент с нормальным функционалом — быстро переходят к нему, лишая старого тех крох, которые вы назвали деньгами и всего остального.
                                                                                                        • +5
                                                                                                          Только большинство приложений даже до этого момента не доживают
                                                                                                        • +9
                                                                                                          Вот же вы какие а!

                                                                                                          Может получится так, что пока Петя искал фабрики фрэймворков фабрик на Javа, конкурент Вася сделал за неделю качественное веб-приложение на PHP, которое работет быстро безглючно, в нем нет багов, потому что Вася профессионал в своем деле, не содержит говнокод, хорошо документированно, разделено на слои, и будущие программисты будут читать код и восхищатся.

                                                                                                          Язык программирования всего лишь инструмент, вы думаете на PHP нельзя сделать фабрики фабрик фабрик, или на Java нельзя наговнокодить, как же вы заблуждаетесь. Просто для всего свое место.
                                                                                                          • +1
                                                                                                            А если бы Вася знал какой-то фреймворк на ПХП (или имел свой собственный — он же профессионал), то, весьма вероятно, он бы сделал приложение дня за три.
                                                                                                        • +12
                                                                                                          Энтерпрайз-стайл замечательно описывается чудесным стихотворением: «Дом, который построил Джек».
                                                                                                          • –2
                                                                                                            Зато потом, когда уже построили дом, со всеми предварительными фабриками фабрик фабрик, так просто и приятно можно будет сделать перепланировку, добавить к дому комнату или целый этаж, загон для кроликов и просторную конюшню — буквально в пару кликов.
                                                                                                            Но это будет сильно потом, а пока — пишем тонны однообразного кода :)
                                                                                                            • +11
                                                                                                              > буквально в пару кликов

                                                                                                              Это сказки.
                                                                                                            • +1
                                                                                                              Фабрика домов, который построил Джек
                                                                                                              • 0
                                                                                                                А это фабрика фабрик домов, который построил Джек.
                                                                                                            • +9
                                                                                                              Зачем вам веб приложение? Лучше пишите рассказы.
                                                                                                              • +3
                                                                                                                Огромный фреймворк — огромная беда. Предпочитаю использовать небольших библиотеки, с понятными входами\выходами. Их всегда можно отладить\заменить, они дают в руки те самые молотки и рулетки, а уж думать головой как их использовать — я буду сам.
                                                                                                                • +5
                                                                                                                  Понадобилось одному джуниору написать тулзу на Java, которая парсит билд-лог большого продукта и рассылает результаты с прикрепленной информацией из SVN по корпоративной почте. Что же в classpath этой тулзы?
                                                                                                                  image
                                                                                                                  Зато с задачей джуниор справился быстро и тулза работает. Область применения тулзы не накладывает никаких ограничений на потребления ресурсов, время выполнения и прочее. Тулзу легко изменять и кастомизировать.
                                                                                                                  Мораль: не так уж плохи фрэйморки, просто нужно понимать где и как их можно/нужно использовать. А молотки на самом деле никто не отменял, они все так-же доступны для использования всем желающим.
                                                                                                                  • +10
                                                                                                                    слишком хорошо для джуниора
                                                                                                                    • +5
                                                                                                                      Религия мне не позволяет называть себя не джуниором, до тех пор пока я все-таки не переосилю свою лень и не прочитаю пару книжек. Фрэйморки с документацией, гуглы и форумы, это все конечно хорошо, но java-core нужно знать, и книжки читать. А лезть в гугл что бы вспомнить чем отличается ArrayList от LinkedList — такое позволительно только джуниору.
                                                                                                                  • 0
                                                                                                                    а зачем там транзакции?
                                                                                                                    • 0
                                                                                                                      jboss-transaction? hibernate-core тянет как зависимость.
                                                                                                                      • 0
                                                                                                                        «парсит билд-лог большого продукта и рассылает результаты с прикрепленной информацией из SVN по корпоративной почте»
                                                                                                                        А хибернейт то зачем?..
                                                                                                                        И одновременно драйвер SQLite (SQLJet) и Derby… что-то явно лишнее.

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

                                                                                                                        Хотя освоить ОРМ это конечно круто (-:
                                                                                                                        • 0
                                                                                                                          SQLJet подтягивает svnkit.
                                                                                                                          А хибернейт… такая уж вышла архитектура из-за особого способа интеграции с ElectricCommander, нужно было какое-то хранилище данных. Вместо реализации своего велосипеда с коллекциями и мапами, решено было использовать JPA.
                                                                                                                  • +6
                                                                                                                    Наверное, теперь кто-нибудь напишет статью «Почему я люблю фреймворки».
                                                                                                                    • +3
                                                                                                                      Скорее, судя по комментариям, — «почему я люблю django!»
                                                                                                                      • +4
                                                                                                                        А потом кто-то напишет фреймворк для написания статей про фреймворки и каждый сможет читать ту статью, которая ему нравится.
                                                                                                                      • +9
                                                                                                                        И если Вы хотите убить свою бывшую девушку, то ничто не заменит молотка с круглым бойком. — спасибо, буду знать.
                                                                                                                        • +3
                                                                                                                          Из этого правила есть исключение: если ваша бывшая девушка по совместительству политическая проститутка, то вам понадобится ледоруб.
                                                                                                                        • –8
                                                                                                                          Я тоже ненавижу фреймворки вроде JQuery.
                                                                                                                          Всё, что они предлагают либо уже есть, либо реализуется в несколько строк кода без всяких JQuery.
                                                                                                                          • –10
                                                                                                                            Полностью поддерживаю, хочется убить молотком с круглым бойком или ледорубом тех, кто подключает jQuery из-за лени ради одной анимации, которую можно написать в 10-15 строк (или ради чего-нибудь другого такого же).
                                                                                                                            • +14
                                                                                                                              А зачем писать 15 строк, если можно просто написать?
                                                                                                                              $('#element').fadeIn();
                                                                                                                              
                                                                                                                              • –4
                                                                                                                                1 function fadeIn(el, total,period) {
                                                                                                                                2 var step=total/(period*30),period=1000/30;
                                                                                                                                3 setTimeout(
                                                                                                                                4 (function (el, period, step,total) {
                                                                                                                                5 var opa=0;
                                                                                                                                6 return function () {
                                                                                                                                7 opa+=step;
                                                                                                                                8 opa < total&&setTimeout(arguments.callee, period);
                                                                                                                                9 el.style.opacity=opa;
                                                                                                                                10 }
                                                                                                                                11 })(el, period, step,total),
                                                                                                                                12 period);
                                                                                                                                13 }

                                                                                                                                Лучше подключить ещё один говнофреймворк с кучей ненужных функций с кучей избыточного кода, увеличить время загрузки страницы и добавить лишнюю зависимость.
                                                                                                                                И ещё, минусуйте на здоровье.
                                                                                                                                • +25
                                                                                                                                  В старых IE — не работает, arguments.callee — depracated, куча магических чисел. Что значит period*30? Зачем вы потом его делаете равным 1000/30 (это, видимо, 30 фпс?).
                                                                                                                                  Что, если элемент уже отображён, или его opacity равно 0.5? Что, если кто-то запустил второй fadeIn или fadeOut к этом элементу паралельно? Например, навели на коммент на хабре — он начал появлятся, убрали мышку с коммента до того, как он появился — элемент пропадает. Зачем дважды повторять setTimeout? Если два элемента паралельно запустить — у них может быть рассинхрон из-за того, что в разных таймаутах — будет стробить.

                                                                                                                                  Давайте, так по чуть-чуть и вы тут в комментах jQuery напишите)
                                                                                                                                  • –17
                                                                                                                                    1 о стандартах
                                                                                                                                    Если браузер не соответствует стандартам, то это проблема браузера, а не разработчика.
                                                                                                                                    Кроссбраузерные извращения не нужны, если код использует стандартные функции, которые работают соответственно стандарту.
                                                                                                                                    Если используются нестандартные расширения (которые почти всегда дают выигрыш, например toSource или btoa и atob мозиллы), тогда проблема разработчика — предусмотреть их отсутствие.

                                                                                                                                    Так что на старый ие и я, и все нормальные разработчики давно клали.
                                                                                                                                    Более того, я вообще ие не учитываю, так как этот браузер ощутимо проигрывает хрому, файрфоксу и опере, пусть лучше посетитель сменит это г**** на нормальный браузер.
                                                                                                                                    Посетитель от этого выиграет.
                                                                                                                                    То, что в некоторых фирмах не разрешают устанавливать браузер по вкусу — проблема фирмы.
                                                                                                                                    Скажи админу, админ установит. Уверен, что ему тоже не нравится эксплорер. Также можно отлично юзать портативку.
                                                                                                                                    2 >deprecated
                                                                                                                                    bugs.ecmascript.org/show_bug.cgi?id=263
                                                                                                                                    3 вы правильно поняли, что 30 — это fps
                                                                                                                                    1000 — микросекунд в секунде
                                                                                                                                    period — время анимации, после присваивания используется в качестве времени между кадрами
                                                                                                                                    step=total/(period*30) — приращение непрозрачности
                                                                                                                                    пришлось покапитанствовать
                                                                                                                                    30 не вынесена в константу из соображений 13 строк кода
                                                                                                                                    4 >Что, если элемент уже отображён, или его opacity равно 0.5
                                                                                                                                    исчезнет и проявится, вполне в соответствии с названием
                                                                                                                                    изменить, чтобы проявлялось от текущего уровня несложно.
                                                                                                                                    >Что, если кто-то запустил второй fadeIn или fadeOut к этом элементу паралельно
                                                                                                                                    Я просто исходя из названия набросал функцию проявления до определённой непрозрачности.
                                                                                                                                    Возможность параллельного запуска (как и fadeIn/fadeOut) не была предусмотрена, ибо во-первых нафиг (мы же не jquery пишем, а функцию под конкретные задачи), а во-вторых вряд ли бы уложился в 13 строк кода. Просто нужно тогда к DOMNode прицепить свойство — состояние фейда, и от него плясать.
                                                                                                                                    5 >Давайте, так по чуть-чуть и вы тут в комментах jQuery напишите)
                                                                                                                                    это вряд ли
                                                                                                                                    • +11
                                                                                                                                      Об этом и речь. А я написал одну строчку и обо всём этом даже не задумывался
                                                                                                                                      • +3
                                                                                                                                        Если браузер не соответствует стандартам, то это проблема браузера, а не разработчика.


                                                                                                                                        Ну как-то уж совсем…
                                                                                                                                        • +6
                                                                                                                                          Нет, а мне нравится. Это похоже на «если пользователю не удобно смотреть сайт, пусть не открывает»
                                                                                                                                        • +2
                                                                                                                                          Если браузер не соответствует стандартам, то это проблема браузера, а не разработчика.

                                                                                                                                          Отбросим экономический эффект такой точки зрения. А вот навскидку — с каким стандартом совместим этот код?