Зачем ставить закрытые поля и методы на первое место в классе? - PullRequest
28 голосов
/ 22 апреля 2009

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

В чем причина этого?

РЕДАКТИРОВАТЬ: просто чтобы уточнить, я не имею в виду практику объявления всех членов в верхней части класса, но ставить закрытые члены / методы в верхней части объявления класса, прежде чем что-либо публичное.

Ответы [ 11 ]

21 голосов
/ 23 апреля 2009

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

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

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

11 голосов
/ 22 апреля 2009

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

9 голосов
/ 22 апреля 2009

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

4 голосов
/ 22 апреля 2009

Я согласен, что это, вероятно, исходит от C, но он также выполняет практическую функцию.

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

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

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

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

И, как всегда, нарушение согласованности никогда не бывает хорошей идеей, если нет веских причин для этого.

3 голосов
/ 23 апреля 2009

В ООП - есть две вещи - данные и поведение

Закрытые члены представляют данные, а открытые методы представляют поведение.

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

3 голосов
/ 22 апреля 2009

Две причины.

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

На языке Си и в javascript все ссылки в коде должны быть объявлены и / или определены выше, где на них ссылаются, потому что все ссылки должны быть уже известны. (Да, я знаю, только javascript Сорта.)

2 голосов
/ 22 апреля 2009

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

Что касается меня, я склонен ставить частные методы внизу по причинам, которые вы предлагаете.

1 голос
/ 22 апреля 2009

Я думал, что стандарт defacto - это сначала общедоступные методы! по крайней мере, так я пишу свои уроки. Это помогает мне выбирать структуры данных для моих методов.

0 голосов
/ 28 июня 2013

из-за таких языков, как у вас, как говорит @ChrisF >>, таких как языки интерпретации, Python - выдающийся

0 голосов
/ 22 апреля 2009

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

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

...