Каковы характеристики кода спагетти? - PullRequest
12 голосов
/ 04 апреля 2010

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

Но забудьте об этом, потому что, честно говоря, это единственное, что я знаю.Так что это абсолютно предвзято; D

Итак, мне просто любопытно, что характерно для спагетти-кода?

PS: я знаю только WordPress.Так что, надеюсь, возможно, это поможет кому-то дать отличный ответ для того, кто не имеет большого опыта в разработке полноценного веб-приложения на PHP (например, веб-сайт Stack Overflow).

Ответы [ 4 ]

22 голосов
/ 04 апреля 2010
  • Нет модульности (все в одном файле, классе, модуле, пространстве имен, пакете или любом другом языке, используемом для обеспечения модульности),
  • Много goto х
  • Плохая организация,
  • Нет четкого разделения функциональности и назначения. (То есть, всеохватывающие классы или функции)
  • Длинные функции.
  • Плохое наименование.
  • Нет единого стиля кодирования.
  • Нет четкого контрактного интерфейса между реализацией и клиентами кода. (То есть без указания того, что представляют собой входы, выходы, предварительные и последующие условия функций)
  • Чрезмерная зависимость от внутренних структур данных с небольшой абстракцией.
  • Функции случайным образом переставляют / изменяют глобальное состояние без какого-либо упоминания об этом в документации.
  • Отсутствие комментариев или документации нетривиального кода.
  • Код более сложный, чем должен быть.
  • Отсутствие повторного использования. (много дублированного кода, a.k.a. copypasta )
  • Нет проверки или модульного тестирования (работает на вере).
  • Магические числа.

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

для тех, кто не имеет большого опыта в разработке полноценного веб-приложения на PHP (например, веб-сайт Stack Overflow)

Просто к сведению, но переполнение стека не было разработано с помощью PHP.

7 голосов
/ 04 апреля 2010

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

function hello_testing($conditional_random) {
  if ($conditional_random)) {
      echo "foo is inside";  
  }
}

P.S. http://en.wikipedia.org/wiki/Spaghetti_code

5 голосов
/ 04 апреля 2010

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

Вот почему операторы GOTO (ужасное слово!) Часто цитируются в этом контексте: оператор GOTO передает управление в другое произвольно определенное место в базе кода. Большинство языков программирования имеют команды, которые могут использоваться для имитации поведения стиля goto; например, использование исключений для реализации обычной бизнес-логики, а не для обработки ошибок.

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

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

2 голосов
/ 26 января 2011

WordPress - это самый большой фрагмент кода для спагетти, который я когда-либо видел. Существует шокирующее сочетание PHP, HTML, JavaScript и всего, что находится между ними, в одном и том же файле. Если вы хотите еще один пример кода спагетти, посмотрите на osCommerce или Zen Cart .

На самом деле, я осмелюсь сказать, что большинство PHP-приложений с открытым исходным кодом являются довольно шокирующими примерами программирования на PHP. Если вы хотите взглянуть на хороший структурированный пример (то есть не спагетти), тогда посмотрите на Yii framework или Zend Framework . Такие фреймворки, как CodeIgniter и Kohana , хотя и не спагетти, не очень хорошие примеры того, как структурировать вещи в PHP 5, поскольку они используют многие функции, используемые в PHP 4, просто потому, что нет лучшего способа сделать это до PHP 5 (например, используя наследование на основе пути вместо истинного наследования объекта).

Если вы хотите, чтобы достаточно хороший пример процедурного программирования был сделан правильно, посмотрите на Drupal . Это может быть не самое эффективное приложение PHP из-за сложности, но оно наверняка превосходит WordPress, и вы можете делать с ним много того же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...