Когда Вы пишете закрытый метод, по сравнению с защищенным? [закрытый]

38
задан user151841 8 January 2010 в 20:21
поделиться

8 ответов

Возможно, он существует, но вы не можете изменить его на iPhone без джейлбрейка.

Предположим, что ваш веб-сервер разработки находится на компьютере Mac, почему бы вам просто не использовать его название Bonjour (например, MyMac.local. ) вместо myrealwebserverontheinternet.com ?

-121--753888-

Нет, приложение для iPhone может изменить вещи только в своей маленькой песочнице. (И даже есть вещи, которые вы не можете изменить на лету.)

Ваша лучшая ставка, вероятно, использовать серверы IP-адрес, а не имя хоста. Немного сложнее, но не , что трудно, если вам просто нужно решить один адрес, будет поставить DNS-сервер на ваш Mac и настроить ваш iPhone использовать это.

Методы -121--753891-

public и protected образуют «интерфейс» для вашего объекта, public для разработчиков, использующих (делегирующих) ваш класс, и protected для разработчиков, желающих расширить функциональность вашего объекта путем его подкласса.

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

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

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

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

51
ответ дан 27 November 2019 в 03:19
поделиться

Закрытые члены используются для инкапсуляции внутренней работы вашего класса. Используйте их для хранения данных, к которым только вы хотите иметь доступ. Например, предположим, что у вас есть поле с именем _name и метод получения / установки с именем GetName () / SetName (name). Возможно, вы хотите выполнить некоторую проверку синтаксиса имени, прежде чем позволить SetName успешно выполнить, иначе вы создадите исключение. Делая _name закрытым, вы гарантируете, что эта проверка синтаксиса произойдет до того, как могут произойти какие-либо изменения в имени (если вы сами не измените _name в своем собственном классе, в своем собственном коде). Делая его защищенным, вы говорите любому потенциальному будущему наследнику вашего класса: «Продолжайте и обезьяны с моим полем».

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

0
ответ дан 27 November 2019 в 03:19
поделиться

Другими словами, как я могу узнать в что бы клиент-программист никогда не нужно будет переопределять метод?

Если вы не знаете, предположим, что им это понадобится. Если вы не против (т.е. если вы думаете, что они должны быть в состоянии), тогда используйте protected; в противном случае используйте private.

0
ответ дан 27 November 2019 в 03:19
поделиться

Я всегда делаю все методы частными по умолчанию. Это делается для того, чтобы сохранить интерфейс чистым и простым в обслуживании.

Гораздо труднее изменить или скрыть уже видимый метод, чем сделать частный метод более видимым. По крайней мере, если вам нужно быть совместимым с существующим клиентским кодом.

2
ответ дан 27 November 2019 в 03:19
поделиться

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

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

9
ответ дан 27 November 2019 в 03:19
поделиться

Другими словами, как я могу знать в Продвиньте, что клиентский программист будет Никогда не нужно переопределить метод?

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

Если разработчик чувствует, что ему необходимо скорректировать некоторые функциональные возможности ваших классов, он может выбрать из ряда структурных и поведенческих узоров, например, E.G. Декораторы, адаптеры или подклассы. Использование этих шаблонов хорошее, потому что он инкапсулирует изменения в собственный класс разработчика и покидает свой собственный код нетронутым. Объявляя методы Private , вы убедитесь, что разработчик будет обезьяна с вашим классом. И это плохо.

Прекрасный пример - адаптер дБ Zend Framework. Они препятствуют использованию постоянных соединений, и их адаптеры не имеют никаких средних для этого. Но что, если вы хотите, чтобы это было, тем не менее, и метод адаптера был отмечен частным ( Это не так, но, если )? Поскольку нет способа перезаписать метод, вы бы ( Да, вы ) Измените код адаптера прямо в своем классе или вы копируете и вставьте код в свой собственный класс адаптера, эффективно дублируя 99 % от класса, просто чтобы изменить один вызов функции. Всякий раз, когда есть обновление этого адаптера, вы либо потеряете ваши изменения, или вы не получите его (если вы C & P'D). Было отмечено защищенное (, как оно ), вы могли бы просто написать подкласс PConnectAppter.

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

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

Обновление: , так как я написал это четыре года назад, я пришел к выводу, что по умолчанию для защищенных вещей вместо частных часто приводит к неоптимальным подклассам. Это потому, что люди начнут использовать все, что вы предоставили как защищенные. Это в свою очередь, означает, что вы должны учитывать все эти методы как API и могут не изменить их по желанию. Как таковой, лучше тщательно учитывать, какие точки расширения вы хотите предоставить и сохранить все остальное частное. См. http://fabien.potencier.org/article/47/pragmatism-vover-teory-protected-vs-private для аналогичного взгляда.

26
ответ дан 27 November 2019 в 03:19
поделиться

Это позволит другим объектам запускать slot1 и slot2 по отдельности.

connect( Object1, Signal1, Object2, slot1 );
connect( Object1, Signal1, Object2, slot2 );
connect( Object3, Signal1, Object2, slot1 );
connect( Object4, Signal1, Object2, slot2 );
-121--4904291-

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

-121--3453565-

Не думайте о частной/защищенной/публичной вещи, как будто программисту когда-либо «нужен» метод. Подумайте об этом, как будто вы хотите разрешить им доступ к нему.

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

2
ответ дан 27 November 2019 в 03:19
поделиться

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

Объем дублирующихся данных на крупном предприятии с тысячами пользователей ошеломляет. Многие из этих пользователей хранят одни и те же документы, исходный код и т.д. в своих домашних каталогах. Часто встречаются сообщения о 50-70% дедуплицированных данных , что экономит много места и тонн денег для крупных предприятий .

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

-121--3579498-

Java должен оценивать ваши инструкции слева направо. Он использует механизм, известный как оценка короткого замыкания , чтобы предотвратить проверку второго, третьего и n-го состояний, если первое является ложным.

Таким образом, если выражение myContainer! = null & & myContainer.Contains (myObject) и myContainer имеет значение null, второе условие myContainer.Contains (myObject) не вычисляется.

Изменить: Как уже упоминалось, Java, в частности, имеет операторы короткого замыкания и без короткого замыкания для логических условий. Использование & & инициирует оценку короткого замыкания, а & - нет.

-121--1414209-

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

За исключением случаев, когда я чувствую себя ленивым и делаю все защищенное , что точно не опасно.

0
ответ дан 27 November 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: