что если я оставлю своих учеников открытыми? - PullRequest
2 голосов
/ 13 мая 2010

В c ++ переменные экземпляра по умолчанию являются закрытыми, в Python переменные являются публичными по умолчанию

У меня есть два вопроса относительно одного и того же: -

1: почему в Python все члены по умолчанию являются публичными?

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

Ответы [ 4 ]

13 голосов
/ 13 мая 2010

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

Данные, как и методы, должны быть открытыми (именоваться без начального подчеркивания), если они являются частью разработанного API вашего класса, который вы намерены поддерживать в будущем. В C ++ или Java это вряд ли произойдет, потому что, если вы хотите изменить элемент данных на метод доступа, вам не повезло - вам придется сломать свой API, и каждому клиенту класса придется изменить.

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

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

3 голосов
/ 13 мая 2010

Я не могу комментировать Python, но в C ++ структуры предоставляют публичный доступ по умолчанию.

Основная причина, по которой вы хотите приватную часть вашего класса, заключается в том, что без нее невозможно гарантировать, что ваши инварианты будут удовлетворены.Например, если у вас есть класс строки, который должен отслеживать длину строки, вы должны иметь возможность отслеживать вставки.Но если базовый член char* является публичным, вы не сможете этого сделать.Кто угодно может просто прийти и прикрепить что-нибудь к концу, или переписать свой нулевой терминатор, или вызвать delete[], или что-то еще.Когда вы звоните своему length() участнику, вам остается только надеяться на лучшее.

1 голос
/ 13 мая 2010

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

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

Как Деннис сказал: «Любой может просто прийти и зацепить что-нибудь в конец или перезаписать свой нулевой терминатор». Python относится к пользователю как к взрослому и ожидает, что он позаботится о себе. C ++ защищает пользователя как ребенка.

0 голосов
/ 13 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...