2010-05-13 18 views
2

В C++ переменные экземпляра являются частными по умолчанию, в Python переменные являются общедоступными по умолчаниюЧто делать, если я поддерживаю своих членов класса?

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

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

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

ответ

13

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

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

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

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

+0

+1 .. любите ответ ... особенно там, где вы сказали: «Зачем взвесить язык с помощью механизма принуждения?» – Perpetualcoder

+0

Комментарий к языкам .NET - false. Переход от поля к свойству является изменением API. – porges

+0

@Porges Вы имеете в виду на уровне байт-кода, правильно? – fredoverflow

3

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

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

1

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

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

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

+0

+1 только для баланса -1. – gorsky

+1

Интересно, почему исходный комментатор поставил -1. Спасибо хоть. –

+1

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

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