powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ставлю под сомнение полезность private, public и protected
25 сообщений из 68, страница 2 из 3
Ставлю под сомнение полезность private, public и protected
    #33671487
Fabrichenko Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторбреда смешного
это словосочетание и подразумевало брехню
------------------------------------------
жизнь как пестня
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33671518
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fabrichenko Viktorвот начитаются такого бреда смешного и думают что самые умные :-)))
http://www.computer-science.ru/docs/comp/rus/develop/other/stroustrup_interview/
----------------------------------------
жизнь как пестня
Я этого не читал. Это шутка?

tchingizставь везде и всегда public и будет все хорошо.
в смысле не вижу большой нужды от приватов и протектед.
Самое смешное, что я с тобой не согласен. Если язык не предоставляет более качественные и гибкие средства инкапсуляции, то надо пользоваться теми что есть.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33672144
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinДа. Интерпретатор. Мне тоже долго не нравился такой подход. Коробило отсутствие private, public и protected.
Вопрос не в этом. Меня коробит от "есть специальный метод с предопределенным именем".

SarinНо вот код на питоне:

Лучше ли он? Уж и не знаю. Мне кажется да.
Лично меня в первую очередь ужасает его производительность.

SarinНапример представте себе ситауацию, что в данном примерепридётся ввести ещё одну переменную с такими же ограничениями. Я добывлю строчку. А вы сколько?:)
Если захочу идти этим путем, столько же. Неужели Вы полагаете, что

Код: plaintext
self.__limits__['a'] = {'min':  0 , 'max':  100 , 'type': int}

чем-то отличается от

Код: plaintext
1.
 const  Limits :  array  [ 'A'..'F' ]  of  TLimit = (( Min :  0 , Max :  100 , VType : varInteger ), ... 
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33672224
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
SarinНо вот код на питоне:

Лучше ли он? Уж и не знаю. Мне кажется да.
Лично меня в первую очередь ужасает его производительность.

Производительность питона сопоставима с явой.
http://www.twistedmatrix.com/~glyph/rant/python-vs-java.html
Вобщем-то ява чуток побыстрее в среднем. Следует отметить тот факт что аффтары питона занялись оптимизацией не так давно. И добились выдающихся успехов.

Кстати интересны и тексты тестов.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33672251
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin softwarer
SarinНо вот код на питоне:

Лучше ли он? Уж и не знаю. Мне кажется да.
Лично меня в первую очередь ужасает его производительность.

Производительность питона сопоставима с явой.
http://www.twistedmatrix.com/~glyph/rant/python-vs-java.html
...


Тест старый какой то :-)

Again, I must stress that these are approximate times, which are specific to my computer, my Java version (JDK 1.1.7B, blackdown) , my operating system (Debian GNU Linux 2.2), my python version (Python 1.5.2) and my idiosyncratic test method, which is not strenuous at all. I repeated the tests 3 times and averaged the results to get the numbers you see here. Sources to the tests are available here in .tar.gz format, so you can perform them yourself.

Many Java fans out there are probably asking "why did you choose JDK 1.1?". I know that 1.2 may perform better than this, and I am aware that I did not choose optimal (or even necessarily equivalent) algorithms for the Java test cases. This test is centered around implementing/deploying actual applications. JDK 1.2 is not available on most platforms yet (when I say "most", I'm talking about MacOS, BeOS, OS/2, and friends. With the recent resurgence of the Mac's popularity w/ the iMac, this is especially relevant). Those platforms that ship with Java have a 1.1 implementation, and those platforms that ship with Python have 1.5.2.

Last modified: Fri Apr 7 14:28:25 EST 2000
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33672253
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
иногда хочется не перекрыть, а тупо вызвать protected метод...
а то мли в каком-то DevEx метод определения высоты строки (кажись) -
protected, и значитца чтобы таки эту высоты посчитать - пиши давай, по
образу и подобию (благо сорцы под руками). Дык эта падла ж считает
данные на основании опять-таки protected свойств! туды его в качель....
--
-------------------------
There's no silver bullet!
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33672337
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin softwarer
SarinНо вот код на питоне:

Лучше ли он? Уж и не знаю. Мне кажется да.
Лично меня в первую очередь ужасает его производительность.

Производительность питона сопоставима с явой.
http://www.twistedmatrix.com/~glyph/rant/python-vs-java.html
Вобщем-то ява чуток побыстрее в среднем. Следует отметить тот факт что аффтары питона занялись оптимизацией не так давно. И добились выдающихся успехов.

Кстати интересны и тексты тестов.
Непонятна методология сравнения. Хеши в питоне - это атомарные сущности, а Hashtable - обычный класс целиком написанный на Java. Следовательно, сравнивается клей для связки модулей написанных на С и код целиком выполняющийся c помошью JVM.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33672376
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinПроизводительность питона сопоставима с явой.
В первую очередь я бы не стал называть Яву образцом производительности, хотя это вопрос в основном к ее библиотекам. Более существенно же - это не значит, что плохая программа на Питоне будет быстро работать.

Полагаю, я показал Вам, что такой подход легко реализуется на дельфе. Также нет проблем сделать на плюсах, переопределив оператор []. На яве - можно, но может быть не так синтаксически просто. И, полагаю, Вы понимаете, почему этот подход будет заведомо медленнее простого геттера-сеттера.

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

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

Код: plaintext
1.
2.
3.
Width - в пределах Min+Max..Screen.Width.
Min   - в пределах 0..Width-Max.
Max   - в пределах 0..Width-Min.
Pos   - в пределах Min..Width-Max. 

Дополнительно: при изменении Min/Max/Width следует проверить условие для Pos, и если оно перестало выполняться, увеличить либо уменьшить Pos так, чтобы попасть в допустимый диапазон.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33672379
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyиногда хочется не перекрыть, а тупо вызвать protected метод...
А какие проблемы-то? Вот с private - не пройдет. Но нормальные люди в private упаковывают то, что действительно лучше не показывать наружу.

Я безусловно согласен с тем, что в расстановке видимости элементов класса нужна большая продуманность, и реальные реализации часто недостаточно хороши. Поэтому я давно уже отказался от мысли брать библиотеки без исходников.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33672985
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wrote:
> locky
> иногда хочется не перекрыть, а тупо вызвать protected метод...
>
>
> А какие проблемы-то? Вот с private - не пройдет. Но нормальные люди в
> private упаковывают то, что действительно лучше не показывать наружу.
>
Сорри, очепятался, вечер... ессно private... с protected всё значительно
проще :-)

--
-------------------------
There's no silver bullet!
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33673848
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinЯ не проив ОО. И не против инкапсуляции. Я говорю о том, что есть подход лучше нынешнего.

КАкой?

Делать проверки видимости в Runtime вручную?

И чем же это лучше нынешнего? Тем, что можно что-то там не цензурное с клавиатурой делать (с)Sarin чаще? :)
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33677377
yamapikarya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
таки да, как связаны ппп с ооп? Что мешает вообразить класс ящичком и юзать интерфейсы без всяких приватов? А то блин дурак какой-нибудь в майкрософте расставит их криво, потом прыгай с лишними классами, интерфейсами, наследованиями, переопределениями.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33678507
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно, ни на фиг это не надо все. Надо как в Smalltalk, все данные -- только private. И все, стоять по стойке смирно и без разговоров !!
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33684879
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yamapikaryaтаки да, как связаны ппп с ооп?

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

Возвращаясь на землю.

разбиение классов на пакеты + ппп = одна из реализаций механизма инкапсуляции, именно так эти понятия и связаны.


Что мешает вообразить класс ящичком и юзать интерфейсы без всяких приватов?

А что мешает вообразить себя самолётом, залесть на табуретку, расставить руки и начать жужжать?

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

Не страшно если
- код пишется для очень плохих людей


А то блин дурак какой-нибудь в майкрософте расставит их криво, потом прыгай с лишними классами, интерфейсами, наследованиями, переопределениями.

Ууу... А представляешь, что может сделать дурак, без приватов?!

Кстати, в java доступ к private полям на случай _очень-очень надо и больше так никогда не буду делать_ есть. Через рефлекшин можно делать с классами, что хочешь. Остаётся верить, что пока дурак научится, как это сделать, он может быть успеет поумнеть :)
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33685127
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinИнкапсуляция - очень хорошо!

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

Вопрос к автору.

Вы можете привести примеры больших проектов,
разработанных с применением Python? Есть-ли информация
об их успешном внедрении?

P.S. Прошу прощения за то, что поздно появился в топике.

P.P.S. О питоне слыхал... краем уха.
Не юзал.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33685444
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsПозволяя кому-либо получить доступ к этим данным, мы жестко связываем интерфейс класса и то, как он реализуется.
Хм. При том, что я согласен с Вами, это не есть хороший ответ на заданный вопрос. Практически Вы, как в известном анекдоте говорите: "..чем армян".

Sarin говорит следующее: а давайте уберем создаваемый компилятором забор и вместо этого все будем умными и сознательными людьми; если рядом с полем-методом стоит комментарий "внутреннее. не трогать", то будем пользоваться им только в самом крайнем случае.

Да, сугубо теоретически можно так работать - примерно так же теоретически возможно построить коммунизм. Проблема в обоих случаях одна и та же: реально существующие люди не готовы пользоваться этим подходом так, чтобы его достоинства перевешивали его недостатки. Если очень грубо, то все сводится к примерно следующему: кто больший дурак, разработчик некоего кода (API, библиотеки итп) или прикладник, которому требуется им пользоваться. Бывает и так, и этак, но все-таки чаще второе.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33685483
мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почти идеальная модель в клиппере:
public
static
private
local
не хватает только global
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33685498
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton SarinИнкапсуляция - очень хорошо!

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

Вопрос к автору.

Вы можете привести примеры больших проектов,
разработанных с применением Python? Есть-ли информация
об их успешном внедрении?

P.S. Прошу прощения за то, что поздно появился в топике.

P.P.S. О питоне слыхал... краем уха.
Не юзал.

слышал, что гугл его активно использует.
тынц1
тынц2
подтверждение
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33686835
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По первой ссылке я нашел краткую аннотацию по Питону


Python is a dynamic object-oriented programming language
that can be used for many kinds of software development.
It offers strong support for integration with other
languages and tools, comes with extensive standard
libraries, and can be learned in a few days. Many
Python programmers report substantial productivity
gains and feel the language encourages the development
of higher quality, more maintainable code.

Python runs on Windows, Linux/Unix, Mac OS X, OS/2,
Amiga, Palm Handhelds, and Nokia mobile phones. Python
has also been ported to the Java and .NET virtual machines.

Python is distributed under an OSI-approved open source
license that makes it free to use, even for commercial products.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33687398
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Вы можете привести примеры больших проектов,
разработанных с применением Python?
Питон активно используется гуглем, НАСА и много где ещё.
Большие проекты: для затравки Zope и Plone.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33688366
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer NotGonnaGetUsПозволяя кому-либо получить доступ к этим данным, мы жестко связываем интерфейс класса и то, как он реализуется.
Хм. При том, что я согласен с Вами, это не есть хороший ответ на заданный вопрос.
Я отвечал yamapikarya'ку о связи ппп с ооп.


Sarin говорит...

Да, сугубо теоретически можно так работать - примерно так же теоретически возможно построить коммунизм.

А если отвечать ему...

Sarin отчасти прав, говоря, что полезность ппп сомнительна.

Прав постольку, поскольку набора "ппп" не достаточно для того, чтобы обеспечить закрытость класса _для использования_ и открытость _для расширения_.
Всё равно остаётся необходимость различать "открытые и публикуемые методы" (с) Фаулер. Взять, н-р, паттерн стартегия. Классу стратегии требуется полный доступ к компонентам класса, который она обслуживает.
Этого можно добиться если
а) объявлять все стратегии внутри класса (в java это inner class)
б) выставить из класса на ружу геттеры и сеттеры к закрытым полям.

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

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

Тем не менее использование ппп
- повышает "дуракоусточивость" (если есть возможность сделать глупость, ей обязательно кто-нибудь воспользуется, а "нет лопаты - нет проблем").
- позволяет ограничить видимость компонент класса (если поле класса может изменить кто угодно, какую я могу дать гарантию, что инвариант класса не нарушится? мне придётся постоянно его проверять (как предлагает делать Sarin), а это вычислительный overhead + огромное пространство для runtime ошибок)

Т.к. альтернтива питона не даст мне лучшего, чем ппп, то для меня она не альтернатива.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33695569
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
Всё равно остаётся необходимость различать "открытые и публикуемые методы"
Не соглашусь. Отметим, что это вопрос вкусов, неформализуемый. Такая "необходимость различать" очень похожа на оправдание дружественности (которая имхо не нужна). Это желание имхо возникает при черезчур мелком разбиении на классы; если "один правильный класс" разбивать на несколько взаимодействующих мелких, придется выносить в паблик то, что хотелось бы оставить в привате.

NotGonnaGetUs(с) Фаулер. Взять, н-р, паттерн стартегия. Классу стратегии требуется полный доступ к компонентам класса, который она обслуживает.
Хм. Почему это? Ему требуется доступ к интерфейсу класса, если я правильно помню этот паттерн. Поясните?

NotGonnaGetUsТ.к. альтернтива питона не даст мне лучшего, чем ппп, то для меня она не альтернатива.
Тут полностью согласен.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33699216
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЭто желание имхо возникает при черезчур мелком разбиении на классы; если "один правильный класс" разбивать на несколько взаимодействующих мелких, придется выносить в паблик то, что хотелось бы оставить в привате.

Согласитесь, тут есть некий парадокс: чем мельче кубики, тем легче их повторно использоваь, но при этом появляется и больше способов как их использовать не правильно.
В итоге, создавая "один правильный класс" мы решаем задачу о сокрытии реализации и отказываемся от написания повторно используемых компонентов.
А вот чтобы "и овцы целы, и волки сыты"...

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

И всё-таки есть объективные ситуации, когда ппп не хватает.

Если говорить о java, то помимо public и private, есть модификаторы protected (пакет + наследники) и default (пакет). Если требуется открыть доступ только наследникам класса, что вполне "правильное"(?) желание, то сделать этого не получится. Придётся открыться всему пакету.

Другой пример.
Был класс TextContainer. Он содержал методы insert(), delete(), и т.п.
Возникла необходимость эффективно реализовать операции undo/redo (прежде эти операции выполялись посредством клонирования всего Text'a).
Как быть? Используем command паттрен.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Метод insert(xxx){yyy} переименовываем в _insert и подменяем методом 
insert(xxx){
  Command command =  new  InsertCommand(xxx);
  command.execute();  // содержит вызов переименованного метода _insert(xxx);
  history.push(command);
}
undo(){
  history.pop().undo();
}
Какой должен быть модификатор видимости у метода _insert?

Public? Нельзя, т.к. если его просто так дёрнуть, то операция undo "поломается".
Private? Значит классы команд должны быть реализованы внутри класса TextContainer.

Считать ли это "концом света" ? - В данном конкретном случае нет, но душок остаётся.


softwarer
NotGonnaGetUsВзять, н-р, паттерн стартегия. Классу стратегии требуется полный доступ к компонентам класса, который она обслуживает.
Хм. Почему это? Ему требуется доступ к интерфейсу класса, если я правильно помню этот паттерн. Поясните?

Классу стратегии не "требуется" доступ к интерфейсу, он только к интерфейсу и имеет доступ (т.е. к открытым компонентам класса). Соответственно, если не прибегать к созданию _объекта посредника_ для передачи закрытых данных, то все необходимые компоненты класса должны быть открыты.

Как и большинство паттернов, паттерн стратегия приводит к созданию синтетических объектов. Они не отражают модель предметной области, а представляет способ, которым мы решаем сугубо технические задачи.
Н-р, стратегия это просто способ организовать "переключение" между различными вариантами поведения. Класс (контекст) для которого создаются стратегии и стратегии на самом деле "один правильный класс", поэтому реализация стратегии может быть завязана на реализацию класса.
И хотя это можно было бы назвать вопиющим нарушением всех основ ООП, мы называем это другими словами, потому что _знаем_ и _следуем_ правилам работы с такими синтетическими конструкциями.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33699281
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsСогласитесь, тут есть некий парадокс: чем мельче кубики, тем легче их повторно использоваь,
Не соглашусь. С одной стороны, легче использовать каждый конкретный кубик, с другой стороны время решения задачи (aka построения дома) при черезчур мелких кубиках стремительно растет. Именно поэтому необходимо искать некий наиболее удачный промежуточный размер.

NotGonnaGetUsно при этом появляется и больше способов как их использовать не правильно.
Хм. "Использовать кубик неправильно" - имхо несколько бессмысленное словосочетание, приобретающее смысл только в неправильных кубиках.

Если помните, некоторое время назад в теме про exception-ы наш собеседник говорил о "неправильном порядке вызова методов", в то время как я ругал такой подход кривой реализацией. Это другая грань той же проблемы; правильный кубик, используя в соответствии с публикуемым им интерфейсом, просто невозможно использовать "неправильно". Мало того, в правильном кубике вообще говоря стоит минимизировать предположения о том, как он будет использоваться - иначе кубик получится неуниверсальным.

Допустим, кирпич. Его интерфейс - это габариты, прочность и прочее. И хотя Вы можете полагать, что из него правильно складывать дома, на самом деле его ничуть не хуже можно использовать как гнет для квашенья капусты. Потому что это правильный кубик :)

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

NotGonnaGetUsИнтересным примером являются базы данных. В схеме определяются сущности, которым всё друг о друге известно, что позволяет строить какие угодно дикие select'ы и update'ы. И при этом никто не плачет и не жалуется, что инкапсуляции нет - все живы и здоровы.
Я бы не сказал, что Вы правы :) В БД используются подходящие для этой задачи формы инкапсуляции; наиболее существенно то, что схема сама по себе является синглтоном, обладающим вполне определенным интерфейсом (и определенными скрываемыми деталями реализации). По сравнению с "классическим ООП" введено интересное понятие "роль" - по сути, разным пользователям предоставляются разные интерфейсы к одному и тому же объекту. Кроме того, существует определенная иерархия инкапсуляции внутри объекта-схемы - скажем, таблица предоставляет свой интерфейс (поля, методы для запроса-изменения), но скрывает детали реализации (индексы, ограничения). Наконец, существует естественный уровень абстрагирования, интерфейсы "по имени" - скажем, я в любой момент могу переименовать таблицу, создать view с тем же именем, и все ранее табличные операции будут работать с этим view. Ну, пакеты предоставляют просто-таки классическую инкапсуляцию (и без них программировать уже.. очень тоскливо).

NotGonnaGetUsИ всё-таки есть объективные ситуации, когда ппп не хватает.
Безусловно, расширять в принципе можно до бесконечности. Это опять-таки задача поиска оптимума.

NotGonnaGetUsЕсли говорить о java, то помимо public и private, есть модификаторы protected (пакет + наследники) и default (пакет). Если требуется открыть доступ только наследникам класса, что вполне "правильное"(?) желание, то сделать этого не получится. Придётся открыться всему пакету.
Ну, это всего лишь дружественность, которую, с моей точки зрения, стоило бы выбросить и из дельфы, и из явы, и из плюсов. В яве, если мне не изменяет память, неприятно еще и отсутствие "наследования" пакетов. Если я решил взять пакет X.Y.Z и отрефакторить его на X.Y.Z.T1, X.Y.Z.T2 и X.Y.Z.T3, это запросто приведет к вороху ошибок недоступности.

NotGonnaGetUsДругой пример.
Хм. А зачем делать именно так? Я бы сказал, "метод insert переименовываем в _insert" - звучит чертовски необъектно, не находите?

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

Как одна из возможных реализаций (с Вашего разрешения, я не буду добавлять проверок на null и прочий необходимый мусор):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
 interface  TextContainer {
   public  String getText ( int  pos,  int  len);
   public   int  getCaret();
   public   void  setCaret ( int  pos);
   public   void  insert (String data);
   public   void  delete ( int  length);
}

 interface  Undoable {
   public   void  undo();
   public   void  redo();
}

 abstract   class  Command {
   protected  containter =  null ;
   protected  cmdRedo =  null ;
   public  Command (TextContainer _container) {container = _container;}
   public   abstract  apply();
   public  Command getRedo() {  return  cmdRedo;}
   public   final  Command makeUndo() {
    Command = makeUndoCommand();
    Command.setRedo ( this );
     return  Command;
  }
   protected   abstract  Command makeUndoCommand();
   protected  setRedo (Command _cmdRedo) {cmdRedo = _cmdRedo};
}

 class  MoveCommand  extends  Command {
   int  pos = - 1 ;
   public  MoveCommand (Container _container,  int  _pos) {
     super  (_container);
    pos = _pos;
  }
   public   void  apply() {
    container.setCaret (pos);
  }
   protected   void  makeUndoCommand() {
     return   new  MoveCommand (container, container.getCaret());
  }
}

 class  InsertCommand  extends  Command {
   protected  String data =  null ;
   public  InsertCommand (TextContainer _container, String _data) {
     super  (_container);
    data = _data;
  }
   public  apply() {
    container.insert (data);
  }
   protected  Command makeUndoCommand() { 
     return   new  DeleteCommand (container, data.length);
  }
}

 class  DeleteCommand  extends  Command {
   protected   int  length =  0 ;
   public  DeleteCommand (TextContainer _container,  int  _length) {
     super  (_container); 
    length = _length;
  }
   public   void  apply() {
    container.delete (length);
  }
   protected  Command makeUndoCommand() {
     return   new  InsertCommand (container, container.getText (container.getCaret(), length));
  }
}

 class  UndoableTextContainer  implements  TextContainer, Undoable {
   private  TextContainer container =  null ;
   public  UndoableTextContainer (TextContainer _container) {
    container = _container;
  }
   public  String getText ( int  pos,  int  len) {
     return  container.getText (pos, len);
  }
   public   int  getCaret() {
     return  container.getCaret();
  }
   public   void  setCaret ( int  pos) {
    editCommand ( new  MoveCommand (container, pos));
  }
   public   void  insert (String data) {
    editCommand ( new  InsertCommand (container, data));
  }
   public   void  delete ( int  length) {
    editCommand ( new  DeleteCommand (container, length));
  }
   public   void  undo() {
    Command cmdUndo = undo.pop();
    redo.push (cmdUndo);
    cmdUndo.apply();
  }
   public   void  redo() {
    Command cmd = redo.pop();
    undo.push (cmd);
    cmd.getRedo().apply();
  }
   protected   void  editCommand (Command command) {
    Command cmdUndo = command.makeUndo();
    undo.push (cmdUndo);
    redo.clear();
    command.apply();
  }
}

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

NotGonnaGetUsКлассу стратегии не "требуется" доступ к интерфейсу, он только к интерфейсу и имеет доступ (т.е. к открытым компонентам класса). Соответственно, если не прибегать к созданию _объекта посредника_ для передачи закрытых данных, то все необходимые компоненты класса должны быть открыты.
Я не понимаю, зачем здесь нужно "передачи закрытых данных". Вся суть этого паттерна - я бы его скорее назвал "Алгоритм" - в абстрагировании от закрытых данных обрабатываемого объекта.

NotGonnaGetUsКласс (контекст) для которого создаются стратегии и стратегии на самом деле "один правильный класс",
Не согласен. Например, можно сделать класс "алгоритм сортировки", работающий с интерфейсом типа [getCount();compare(int,int)]. И после этого можно сделать стратегию "Сортировка", параметризуемую алгоритмом и коллекцией Comparable объектов. Решительно не вижу, где здесь "один правильный класс" из объединения этих объектов.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33699350
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про кирпич, имхо подразумевалось следующее: если строишь дом из кирпичей, то их можно ложить друг на друга, а можно по спирали (в этом случае всё развалится), а если ты строишь панельный дом, вероятность напортачить снижается.

кстати, интересная штука с протектедом. Вот, скажем, определяем мы метод протектедом. Другой прогер берёт, наследует наш класс и зеркалит протектед методы с свои паблик. Просто тупо зеркалит. И смысл тогда в протектеде?
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 2 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ставлю под сомнение полезность private, public и protected
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]