Форматирование кода: Планирование функций на основе иерархии вызовов в файле класса?

10

Предложение от «Чистого кода» Боба Мартина заставляет меня чесать голову… «Если одна функция вызывает другую, они должны быть расположены вертикально, а вызывающая сторона должна быть выше вызываемой»

До сих пор я более или менее придерживался рекомендаций .Net, которые группируют членов класса по типу (свойства, ctors, функции) и видимости (public / prot. / Private). Совет кажется поначалу проблемой ... но он "может сработать". Лично я сталкивался со случаями, когда мне нравился этот макет - его легче развернуть, когда вы находитесь в правильной цепочке вызовов.

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

Кто-нибудь пробовал это в течение длительного периода?

Обновление: похоже, что фрагмент кода в порядке

class SomeType()
{
  /// fields, ctors, et. all
  public void Method1()   { // calls HelperMethod1 and HelperMethod2 }
  private void HelperMethod1 { // calls HelperMethod3 }
  private void HelperMethod3 {}
  private void HelperMethod2 {}

  public void Method2 () { // and so on... }

}
Gishu
источник
2
Ужасный «дядя Боб» - не самый острый карандаш в коробке.
Нил Баттерворт
1
Идея состоит в том, чтобы просто «дать мне общую картину перед мельчайшими деталями». Адаптируйте по мере необходимости.
Райан Калпеппер
2
Орлы, должно быть, уже близко к тому, чтобы снова собраться, потому что я согласен с комментарием Нейла. Я вырос на PASCAL и «ставил мелочи на первое место», потому что компиляторы PASCAL требовали, чтобы все вещи были определены до того, как на них будут ссылаться, и объявления FORWARD обычно не одобрялись.
Джон Р. Штром
@Neil - я пытаюсь судить о достоинстве совета .. независимо от источника. @ Джон - и совет противоположен предварительным декларациям .. сначала вы называете вызывающего абонента ... вызываемого абонента объявляются чуть ниже вызывающего.
Гишу
@ryanc - в прелюдии к этому абзацу подчеркивается, что «тесно связанные / связные» понятия должны быть вертикально близко друг к другу [Предотвращает прокрутку, когда вы пытаетесь что-то выяснить]. Вызываемые функции располагаются под вызывающей стороной в порядке вызовов. Смотрите добавленный фрагмент кода
Gishu

Ответы:

2

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

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

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

Томас Оуэнс
источник
+1 за IDE; чем лучше IDE, тем меньше нужно беспокоиться о таких вещах
user281377
1

Дело в том, что названные вещи менее интересны, чем называть вещи. Чем больше метод вызывает другие методы, тем более вероятно, что этот метод является частью внешнего API объекта (в отличие от подробностей реализации). Это означает, что внешний API класса - публичные методы, если ваш язык поддерживает эту концепцию, - естественно, «захочет» находиться в верхней части файла, упрощая поиск этих методов. И наоборот, вспомогательные функции и тому подобное «захотят» оказаться внизу файла.

(Я объясняю концепцию, а не оцениваю ее эффективность.)

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

Если под длительным сроком вы имеете в виду более пары дней? Тогда нет
. Пару лет назад я начал делать это на каком-то новом коде и медленно сводил меня с ума, пока не остановился.

Мое личное предпочтение при планировании занятий

class MyClass
{
    // static fields
    // fields
    // constructors
    // properties
    // methods
} 

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

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

Каждый раз, когда я открываю один из его классов, я умираю немного внутри :(

Бинарный Беспорядок
источник
Я не защищаю большие классы с регионами, добавленными, чтобы замаскировать запах. Не пытаясь стать религиозным ... но наличие последовательной схемы в проекте ускоряет процесс - зная, где искать. Группируем видимость как дополнительное преимущество, заключающееся в том, что общедоступный API-интерфейс близок друг к другу, так что вы можете найти свою конкретную точку входа и углубиться в нее ...
Gishu
А конструкторы? Те идут под "методы"?
Коди Грей
@ Коди Грей: Извинения, забыл ctors!
Binary Worrier
@Gishu: я считаю, что современные инструменты визуализации и навигации избавили от необходимости строгой разметки файлов. Имеет ли значение, где реализован метод, когда я могу щелкнуть правой кнопкой мыши по использованию и «Перейти к определению»?
Binary Worrier