Зачем ставить частные поля и методы в верхней части класса?
Я видел этот де-факто стандарт во многих местах на многих языках, но я его никогда не понимал - зачем ставить ваши частные поля и методы в начало объявления класса? Метафорически кажется, что личные вещи должны располагаться внизу (скрытые), и все, что должно быть на публике должно быть наверху, так что, когда вы читаете класс сверху вниз, вы сначала видите публичный интерфейс, а затем внутреннюю работу.
Каковы причины этого?
EDIT: просто для того, чтобы уточнить, я не имею в виду практику объявления всех членов в верхней части класса, но о том, чтобы помещать частные члены/методы в начало объявления класса, прежде чем что-либо публичное.
Ответы
Ответ 1
Это связано с тем, что вы должны были объявить все, что включает в себя функции, а также переменные - прежде чем вы сможете их использовать.
Внутренние (частные) переменные и функции переместились в начало файла, а внешние (общедоступные) функции вошли в нижнюю часть файла. Это означало, что публичные функции могут ссылаться на внутренние функции. Если у вас была рекурсия, вам придется переслать ссылку на функцию, объявив ее профилем.
Когда языки допускают, чтобы код охватывал несколько файлов, вам приходилось публиковать объявления функций и переменных в файлы заголовков, чтобы они могли быть включены в другие файлы в проекте - или даже в другие проекты.
Ответ 2
Вероятно, это происходит со времен C, когда все переменные должны были быть определены вверху, как часть инициализации. Кроме того, спецификатор доступа по умолчанию является private
, так что он может спасти вас от лишнего private:
позже в вашем определении класса.
Ответ 3
Лично, когда я пытаюсь прочитать код другого и понимаю его, мне нравится иметь контекст, который предоставляют частные поля. Это дает мне быстрый взгляд на то, что они делают и что я могу ожидать увидеть. Если все сделано правильно, это может дать хороший предварительный просмотр, почти как оглавление для остальной части кода.
Ответ 4
Я согласен, что он, вероятно, выходит из C, но он также служит практической функции.
Во всех вещах, которые вы хотите узнать, в том порядке, в котором такие знания необходимы, например, как добавить, прежде чем научиться умножать.
В случае кода ваши публичные функции будут обычно ссылаться на внутренние частные, и ваши частные функции с меньшей вероятностью будут ссылаться на публичные (хотя, безусловно, есть перекрытие.) Итак, понимая, какие частные переменные у вас есть и что они будут использоваться при попытке понять, что публичные методы делают с этими переменными.
Таким образом, также полезно понять, что делают частные методы, прежде чем читать о публичных методах, которые их вызывают.
По большому счету, я считаю, что это стиль, который исходит из C и более ранних языков, но поскольку он функционально более полезен там, где он есть, я не вижу никакой пользы при переключении стилей.
И, как всегда, нарушение последовательности никогда не является хорошей идеей, если нет невероятно веских причин.
Ответ 5
Две причины.
Если они все вместе наверху, их легко найти и легко проверить при создании новой вещи, чтобы увидеть, какие соглашения об именах работают, и какие имена есть и недоступны.
В языке C и в javascript все ссылки в коде должны быть объявлены и/или определены выше, на которые они ссылаются, потому что все ссылки должны быть уже известны. (Да, я знаю, только javascript sorta.)
Ответ 6
В ООП есть две вещи - данные и поведение
Частные члены представляют данные, а общедоступные методы представляют поведение.
Вы можете думать о поведении только в свете данных, которые он представляет
Итак - почему я хотел бы сохранить элементы данных в верхней части.
Ответ 7
Что касается полей, то довольно часто все частные поля (инкапсуляция и все такое). И они маленькие. Поскольку они маленькие, это приятно и возможно, чтобы собрать их все вместе, а вершина класса - хорошее, стабильное место для их размещения. Я не знаю, является ли это историческим оправданием для него - я думаю, что корни языка C, вероятно, объясняют это лучше, но это может быть причиной того, что мы их там сохраняем.
С моей стороны я склоняюсь к тому, чтобы частные методы были внизу, по причинам, которые вы предлагаете.
Ответ 8
Я думал, что стандарт defacto - это общедоступные методы! по крайней мере, так я пишу свои уроки. Это помогает мне выбирать структуры данных для моих методов.
Ответ 9
Я предполагаю, что это привычка. Вы должны объявлять функции и переменные, прежде чем сможете их использовать, чтобы они были согласованы.
С другой стороны, это то, что вы действительно не хотите, чтобы другие люди читали, поэтому он принадлежит внизу.
Ответ 10
из-за языков, например, где у вас есть @ChrisF, говорит → таких, как языки интерпретации, Python является видным
Ответ 11
Не секрет, что они там. Вы боитесь, что кто-то узнает о внутренней работе? Если у них есть источник, они могут узнать все, что им нужно знать о вашем классе.
Включение их вместе с другими облегчает разработку этого класса. Все ваши переменные класса находятся в одном месте, а также ваши методы.