2009-11-12 7 views
1

В C++ функции должны быть объявлены до их вызова. Это можно было бы обработать с помощью сигнатур функций, но по большей части это больше не требуется в новых языках программирования, C#, Python, ETC.Шаблоны для объявления функций для большей читаемости

Однако, читая другие народы, код и когда нужно структурировать функции в классе, я нахожу, что мне не хватает согласованности, существовавшей на C++.

Какие шаблоны существуют для объявления/заказа при сохранении читаемости и понимания структуры вашего кода?

Edit 1


Вот грубый пример.

class A 
{ 
    private FunkB() 
    { 
    ... 
    } 

    private FunkC() 
    { 
    ... 
    } 

    public FunkA() 
    { 
    FunkB(); 
    FunkC(); 
    } 

    public FunkD() 
    { 
    FunkC(); 
    ... 
    } 
} 

v.s.

class A 
{ 
    public FunkA() 
    { 
    FunkB(); 
    FunkC(); 
    } 

    private FunkB() 
    { 
    ... 
    } 

    private FunkC() 
    { 
    ... 
    } 

    public FunkD() 
    { 
    FunkC(); 
    ... 
    } 
} 

Edit 2


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

+0

Анонимные функции являются основной частью функциональных языков (например, Lisp). Если вы ищете дизайн функционального программирования, вы можете найти некоторую информацию о лучших практиках. – tloach

+0

tloach: Он не говорит об анонимных функциях, он говорит о форвардных декларациях. –

+0

Да, в коде, который я просматриваю прямо сейчас, есть много функций, но они разбросаны по исходному файлу. Я ищу способ упорядочить их соответствующим образом, чтобы облегчить следующий человек, который должен его прочитать. – QueueHammer

ответ

0

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

Некоторые принципы, которые помогают достичь большей читаемости в малом:

Single Level of Abstraction Principle

Single Resposibility Principle (pdf)

Composed Method

И не забывайте, всегда использовать хорошие имена! Вот почему ваш пример не подходит для обсуждения.

0

В IDE порядок методов, кажется, имеет для меня гораздо меньшее значение. Я не читаю весь исходный текст, но я продолжаю вот так: прочитайте метод, найдите интересный вызов функции, попросите IDE открыть объявление этой функции (что вполне может быть в другом источнике). Или найдите интересную функцию, задайтесь вопросом, где она используется, попросите IDE перечислить ссылки.

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

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

Поэтому я бы рекомендовал четко документированные обязанности для класса, часто выраженные в терминах конкретных интерфейсов. Порядок методов в источнике менее важен для меня.

+0

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

0

Как уже упоминалось, с любой достойной IDE порядок функций в файле становится намного менее проблематичным. Это также особенно относится к объектно-ориентированным языкам, где другие методы навигации более полезны, чем последовательное чтение. Например: классная иерархия; класс; называть эйрархию. Если вы действительно пропустите определения функций, может быть, есть что-то на языке, который соответствовал бы этой цели, например: чистые виртуальные классы на C++ (если это то, что они называются) или интерфейсы на Java.

Однако, заявив, что всякий раз, когда я реорганизую текст в исходном файле, я всегда склоняюсь к упорядочению функций на основе их единства [1]. После этого я иду в порядке, функции были родился. Если, как и ваш пример, у меня есть функция, из которой родились другие, более мелкие вспомогательные функции, я бы разместил их ниже, где они были извлечены. Я просто нахожу более интуитивным, чтобы сначала прочитать, что важно, и игнорировать более мелкие детали, пока я не буду знать их, и, видя, что более крупный метод в первую очередь выполняет это. Это похоже на ваш второй пример.

Подводя итог, я бы Big тогда Малый или Общественные затем частные хелперы.

[1] Это запах кода, если в одном классе/файле слишком много группировок, что предполагает их разделение на более мелкие отдельные блоки.

Смежные вопросы