Подтвердить что ты не робот

Код равиоли - почему анти-шаблон?

Недавно я натолкнулся на термин объект Бога, который был описан как "анти-шаблон". Я слышал о плохой практике кодирования, но я никогда не слышал, чтобы они описывали это.

Итак, я отправился в Википедию, чтобы узнать больше, и я обнаружил, что существует анти-шаблон, называемый 'Ravioli code, который описанный как "характеризующийся рядом небольших и (идеально) слабо связанных программных компонентов".

Я озадачен - почему это плохо?

4b9b3361

Ответ 1

Spaghhetti:

Код спагетти - это уничижительный термин для исходного кода

Пельмени:

Код равиоли - это тип компьютера структуры программы, характеризующейся количество малых и (идеально) слабосвязанные программные компоненты. Термин сравнивается с код спагетти, сравнение программы структура к макаронам;

Это их сравнение. Он не говорит об этом анти-шаблоне.

Но я согласен. Статья путается. Проблема не в аналогии с равиоли, а с самой структурой статьи википедии. Он начинает называть спагетти как плохую практику, затем говорит несколько примеров и после этого что-то говорит о коде Равиоли.

EDIT: они улучшили статью. Является анти-шаблоном, потому что

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

Ответ 2

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

Что касается плохой стороны, Googling дает комментарий в http://developers.slashdot.org/comments.pl?sid=236721&cid=19330355:

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

Вы должны судить, разумно ли это:).

Ответ 3

Я бы сказал, что это довольно очевидный код Равиоли и код Лазаньи - это уничижительные термины - намеренно помещены вместе со своим сравнительным макаром "спагетти-код" - и оба термина описывают анти-шаблоны реального мира. Некоторый код очень трудоемкий, чтобы поддерживать и очень подвержен неудаче просто потому, что он разбит на множество отдельных подпроцессов - это код равиоли. В некотором коде есть так много уровней абстракции, что очень сложно реализовать изменение и/или понять, на каком уровне происходит сбой - это код лазаньи. Единственный практический способ внести изменения в код лазаньи - это часто просто обходить слои и писать простой код, который выполняет эту работу. Я должен поддерживать некоторый код равиоли, но в целом такой код страдает от его свертки и не находит широкого использования, поэтому есть несколько примеров этого, с которыми мы все будем знакомы. Напротив, код лазаньи во всем мире. Мне нравится думать, что я сам не пишу код макаронных изделий, но вы можете, по крайней мере, следовать за цепочкой спагетти...

Ответ 4

В значительной степени единственная причина, по которой "код равиоли" сохранилась как фраза, состоит в том, что у программистов есть врожденное чувство юмора. Попытайтесь, как я мог, и поверьте мне, я пробовал - очень трудно придумать пример объектно-ориентированного кода, который был и (а) упакован таким образом, что было очень трудно ориентироваться в том же мета-смысле, что "спагетти" трудно ориентироваться и (b) отражать частой анти-шаблон в практике кодирования.

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

Ответ 5

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

Вы можете вращать свои колеса, пытаясь сделать совершенно прекрасное приложение все более и более слабо связанным, даже не добавляя при этом никакой ценности.

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

Ответ 6

Это не обязательно, не так ли? Статья в Википедии не описывает это как плохое. Ряд слабо связанных программных компонентов, где размер и количество этих компонентов разумно по отношению к проблемной области, звучит для меня идеально.

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

Ответ 7

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

Достаточно разумное количество достаточно малых компонентов. Огромная куча крошечных компонентов без видимой общей структуры не так хороша.

Плохосвязанные компоненты хороши. Компоненты, которые скрывают свои взаимозависимости, чтобы выглядеть слабо связанными, не так хороши.

Возможность видеть взаимосвязь между различными компонентами на самом деле хорошая вещь.

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

TODO: напишите программу "Hello world" как ~ 100 модулей, чтобы продемонстрировать чрезмерную модульность.

TODO2: попытайтесь построить мост из грузовиков с равиоли, чтобы продемонстрировать субоптимальные структурные характеристики.

Ответ 8

Читая статью, Спагетти - это анти-шаблон; но Равиоли и Лазанья не являются анти-образцами.