powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ставлю под сомнение полезность private, public и protected
68 сообщений из 68, показаны все 3 страниц
Ставлю под сомнение полезность private, public и protected
    #33669660
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинайте бить. Только не больно. Надеюсь найдутся соратники.

В чём полезность этих директив?
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669676
latex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в возможности контролировать действия над данными.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669680
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinВ чём полезность этих директив?
Примерно в том же, в чем полезность стен между комнатами, кухней, туалетом...
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669736
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Инкапсуляция - очень хорошо!

Но, во-первых, не кажется ли вам, что лучше было ограничится, например, предупреждениями компиляции, а не ошибками. И, во-вторых, не кажится ли вам, что, например, подход питона практичней и универсальней?
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669749
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinНачинайте бить. Только не больно. Надеюсь найдутся соратники.

В чём полезность этих директив?

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

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

В чём полезность этих директив?
Чтобы никто не дергал те методы, которые я перефасую раз 10 по дороге к релизу и еще раз 50 после перформанс тестов.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669778
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
 latexа какой подход у питона?
В питоне у объектов есть специальные имена методов. 
Такие методы вызываются когда с объектом пытаются что-то сделать. 
Например представить в виде строки. 
Или когда в объект пытаются напечатать. Или когда объект пытаются использовать в арифметических операциях. 
Когда его пытаются использовать в качестве списка. Очень много всяких методо штук 30.

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

Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class c:
	def __init__(self, a, b, c):
	    self.__dict__["a"] = a
	    self.__dict__["b"] = b
	    self.__dict__["c"] = c
	def __setattr__(self, attname, attvalue):
            if attname == "private": raise AttributeError, "Try to acess to private value!"
	    self.__dict__[attname] = attvalue
	def __getattr__(self, attname):
	    return self.__dict__[attname]
	def __str__(self):
	    string = ""
	    for i in self.__dict__.items(): string += "\n%s: %s" % i
	    return string


c1 = c( 123 )
c1.private =  10 
А вот что получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
Traceback (most recent call last):
  File "D:\Development\PyScripts\Новая папка\testclass.py", line  19 , in ?
    c1.private =  10 
  File "D:\Development\PyScripts\Новая папка\testclass.py", line  7 , in __setattr__
    if attname == "private": raise AttributeError, "Try to acess to private value!"
AttributeError: Try to acess to private value!
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669781
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там лишний метод затесался:)
__str__
Он как раз предназначен для "печати" объекта.
Забыл удалить.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669792
latex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слабо понятно, но по-моему с++ проще и логичней: обратился к закрытому полю - получил ошибку при компиляции
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669827
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinНо, во-первых, не кажется ли вам, что лучше было ограничится, например, предупреждениями компиляции, а не ошибками.
Нет, не кажется. Единственное, когда этот подход мог бы быть оправдан - для преодоления тупой файловой дружественности, реализованной в дельфе и в яве (может и еще где-нибудь). Но лично я полагаю, что лучше было бы убить саму дружественность. При этом такой подход не мог бы не привести к некоторым тонким моментам - например, реализовав новый метод в private части класса A, можно сломать его наследника, класс B, из-за возникшей перегрузки методов.

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

Sarin def __setattr__(self, attname, attvalue):
if attname == "private": raise AttributeError, "Try to acess to private value!"
self.__dict__[attname] = attvalue
Хм. То есть в нормальном случае получается длинный switch из реакций на разные имена свойств?

Боюсь, я не очень понял, какое это имеет отношение к инкапсуляции. В любом случае, не отличается от

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 type  
  TMyClass =  class 
   private 
    Data : TStrings ;
   protected 
     function  GetData ( Name :  string  ) :  string  ;
     procedure  SetData ( Name, Value :  string  ) ;
   public 
     property  Data [ Name :  string  ] :  string  read GetData write SetData ;
   end  ;

 function  TMyClass.GetData ;
 begin 
  Result := Data.Values [ Name ] ;
 end  ;

 procedure  TMyClass.SetData ;
 begin 
   if  AnsiSameText ( Name, 'private' )
     then   raise  Exception.Create ( 'Attempt to change private property' )
     else  Data.Values [ Name ] := Value ;
 end  ;

- итого, можно везде писать таким образом.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669867
Ded-fasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
облегчается сопровождение программы колегами и самим автором.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669894
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerХм. Уже не нравится. Дай угадаю - это интерпретатор?

Да. Интерпретатор. Мне тоже долго не нравился такой подход. Коробило отсутствие private, public и protected. Но потом умные люди из рассылки по питону спросили у меня зачем они нужны. С тех пор я не знаю зачем они:)

Подход питона к данному вопросу универсальней. Поясню на примере:
допустим нам надо сделать так чтобы переменные a, b, c и d могли быть только целочисленные. f - только вещественного. Ну я конечно знаю, что для той-же явы - такого вопроса встать не может в принципе

Но давайте теперь выпендримся. Введём ограничения на переменные.
a от 0 до 100
b от -2 до 20
c от 100 до 300
d от -1 до 1
f от 0 до 1
Конечно это можно сделать легко на той-же яве. Ведь нас так призывают скрывать поля под привейтами. И я, лично, скрываю.
Но вот код на питоне:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class c:
        __dict__ = {}
        __limits__ = {}
	def __init__(self):
	    self.__limits__['a'] = {'min':  0 , 'max':  100 , 'type': int}
	    self.__limits__['b'] = {'min': - 2 , 'max':  20 , 'type': int}
	    self.__limits__['c'] = {'min':  100 , 'max':  300 , 'type': int}
	    self.__limits__['d'] = {'min': - 1 , 'max':  1 , 'type': int}
	    self.__limits__['f'] = {'min':  0 , 'max':  1 , 'type': float}
	    
	def __setattr__(self, attname, attvalue):
            if (type(attvalue) == self.__limits__[attname]['type'])\
               and (attvalue <= self.__limits__[attname]['max'])\
               and (attvalue >= self.__limits__[attname]['min']): self.__dict__[attname] = attvalue
            else: raise AttributeError, "Bad value"
	    
	def __getattr__(self, attname):
	    return self.__dict__[attname]
Лучше ли он? Уж и не знаю. Мне кажется да. Потомучто можно представить намного более сложные ситуации которые на питоне решают так же просто. Может чуток сложнее. На яве их решение может оказаться сложнее на порядок.

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

ну да ладно опустим мое (и не только мое) мнение насчет переменных класса и попробуем добавить в Ваш замечательный пример такую вот переменную
номер дисконтной карты с проверкой на валидность ввода

шаблон
ХХХХ-1234-5678-0000

а я могу придумать объект из реальной жизни (в отличие от Вашего) у которого минимум 10 полей вот с такой вот "загогулиной"

что мы получим? получим кусок кода который не поддается никакому пониманию раз и второе очень опасен в плане исправления старых и добавления новых полей (очень легко чего нить испортить в соседних ifах)

в итоге получаем что удобнее писать под переменные несколько методов set, get, и т.д. НО если нет привата тогда очень велик соблазн особенно у "юных похрамистав" дернуть переменную напрямую (ладно переменную, а как получит доступ к служебному методу???) в обход всякой логике

и тогда все старания на смарку, а как документировать если все это хозяйство???!!!
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669957
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В IDEA пишешь класс
Код: plaintext
1.
2.
3.
4.
5.
 class  Foo {
   int  a;
   int  b;
   int  c;
}
потом идешь в меню Refactoring, там в меню выбираешь Encapsulate Fields. он делает перменные приватными и добавляет к каждой get/set методы. Потом прописывашь assertы или проверки (такой рефакторинг тоже может быть есть, не нужен был пока). Плевое дело.
Если уж тебя так напрягает писать структуры-носители и устраивает питоновский перформанс, наследуешься от Hashtable и добавляешь туда рестрикшен сет в каком-нибудь виде.

PS:Че-то я завяз в ночных халтурах...
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33669979
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ставь везде и всегда public и будет все хорошо.

в смысле не вижу большой нужды от приватов и протектед.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33670102
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot vfabr
шаблон
ХХХХ-1234-5678-0000
[/quot]
Вариант номер раз: создать специальный класс для этого типа. Можно, кстати, создать не класс, а метакласс. Но это уже чёрная магия.
Ябы сделал проще: проверял бы эту переменную при попытке выставить её определённое значение при помощи регулярного выражения.

vfabrв итоге получаем что удобнее писать под переменные несколько методов set, get, и т.д. НО если нет привата тогда очень велик соблазн особенно у "юных похрамистав" дернуть переменную напрямую (ладно переменную, а как получит доступ к служебному методу???) в обход всякой логике
Дык пусть они ради бога и читают и выставляют поле. А класс отлавливает эти попытке. Тут нет нарушения инкапсуляции!

Сергей ИльичВ IDEA пишешь класс
Ну дык это уже IDE даёт:)
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33670324
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВариант номер раз: создать специальный класс для этого типа. Можно, кстати, создать не класс, а метакласс. Но это уже чёрная магия.
Ябы сделал проще: проверял бы эту переменную при попытке выставить её определённое значение при помощи регулярного выражения.
это не совпадает с этим заявлением

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

авторДык пусть они ради бога и читают и выставляют поле. А класс отлавливает эти попытке. Тут нет нарушения инкапсуляции!
может словари тоже дураки пишут?

авторИнкапсуляция - в объектно-ориентированном программировании - сокрытие внутренней структуры данных и реализации методов объекта от остальной программы. Другим объектам доступен только интерфейс объекта, через который осуществляется все взаимодействие с ним.
лат.In - в + Capsula - ящичек
вот тут на помощь и приходит приват но Вам то он не нужен так что настаивать не буду не используйте его, но и не песдите в воздух о вещах о которых имеете весьма смутное представление
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33670735
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin Сергей ИльичВ IDEA пишешь класс
Ну дык это уже IDE даёт:)
И это весь твой ответ? А по существу - ты сравниваешь язык, в котором все переменные - это варианты, которые могут содержать либо атом либо хеш из вариантов, с языком со статической типизацией.
Хочешь питоновские объекты - расширяй класс Hashtable.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33671110
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДА! (в след за Бертраном Мейером): не нужны нам private public protected.

Нужны "visible for Class1, Сlass2, Class3" делающих компонент доступным для всех наследников Class1,2,3 (включив в множество классов классы ANY и NONE).

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

Если ставить полезность p-p-p под сомнение, то начать нужно с постановки под сомнение полезности ОО метода.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33671149
Fabrichenko Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот начитаются такого бреда смешного и думают что самые умные :-)))
http://www.computer-science.ru/docs/comp/rus/develop/other/stroustrup_interview/
----------------------------------------
жизнь как пестня
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33671183
Фотография AIZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, парни, наверное автор не подумал о том, что часто проект - коллективная разработка и имена переменных внутри объектов - личное дело разработчика. И вот тут (здесь) и требуются определения видимости (доступности). А ежели один - на один... То и зачем?
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33671321
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fabrichenko Viktorвот начитаются такого бреда смешного и думают что самые умные :-)))

Это фейк.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33671461
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не проив ОО. И не против инкапсуляции. Я говорю о том, что есть подход лучше нынешнего.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность 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
Ставлю под сомнение полезность private, public и protected
    #33699373
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoпро кирпич, имхо подразумевалось следующее: если строишь дом из кирпичей, то их можно ложить друг на друга, а можно по спирали (в этом случае всё развалится),
Отнюдь. Недалено от меня есть весь из себя закругленный в завитках кирпичный дом.

maXmo а если ты строишь панельный дом, вероятность напортачить снижается.
Отнюдь :))

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

maXmoкстати, интересная штука с протектедом. Вот, скажем, определяем мы метод протектедом. Другой прогер берёт, наследует наш класс и зеркалит протектед методы с свои паблик. Просто тупо зеркалит. И смысл тогда в протектеде?
Все нормально. Тот, другой прог принимает ответственное решение. Он отвечает за то, что этот метод входит в интерфейс его класса, безопасен итп. Вполне возможно, для его потомка - более узкого класса - это нормально и правильно, в то время как для широкого базового - недопустимо. Возможно, он не просто публикует, а снабжает дополнительными проверками. Итп. Это уже его зона ответственности; в том числе если через этот метод сломают работу его объекта, бить будут именно его.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33699412
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не отрицаю, что баги можно победить, но при использовании инструментов, позволяющих много что делать и тормозящих производство, приходится постоянно много всего помнить и много за чем следить и очевидно, что тут легче за чем-нибудь не уследить. И если явные ошибки можно поправить, не отходя от кассы, то есть свести их к нулю, то число ускользнувших ошибок так просто не уменьшить. В свете факта, что в раздробленном проекте легче допустить ошибку, получаем, что в таком проекте больше багов при прочих равных условиях.

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

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

С моей точки зрения ключевой вопрос технологии разработки - как раз максимальная ликвидация таких вот "нервных узлов". Нужно делать так, чтобы в каждом конкретном месте, в каждый конкретный момент времени не требовалось "много помнить и много следить". Да, суммарно конечно много - но в каждом конкретном случае достаточно думать о минимуме "соседей".

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

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

Аналогия со строительством тут получается достаточно условной, но: если Ваша задача - сложить избу-пятистенку (прямоугольник со внутренней стеной), то спроектировать ее строительство из кирпича будет легче, нежели из бревен.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33700548
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНужно делать так, чтобы в каждом конкретном месте, в каждый конкретный момент времени не требовалось "много помнить и много следить".
давно както встречал исследование психологов. Там был вывод, что
человек (в смысле средний, разброс характеристик есть, конечно) не может держать в голове более 8 -10 сущностей.
В принципе, требование описать решаемую задачу
/* "описать решаемую задачу" на русский переводится как написать программу.
очень желательно, чтобы сущности были согласованны с предыдущим образованием
и другими областями жизни программиста.
пример.
симметричная операция сравнения в клиппере является примером не согласованной сущности, которая тянет необходимость "помнить много".
одновременно может выполняться
а=б and б != а
*/
за минимальное количество сущностей (уже существующих или созданных)
/*
на текущем языке сущность можно читать как обьект
*/
и есть
требование, из которого будет следовать не нужность много помнить.
язык, который позволяет описывать более широкий класс задач минимальным количеством сущностей и есть хороший язык программирования.
задача решается тщательным проэктированием и правильной архитектурой системы.
в силу размытости понятия сущность - в качестве приблизительной оценки можно использовать другие характеристики - такие как количество строчек
или количество лексем в программе.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33701831
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНе соглашусь. С одной стороны, легче использовать каждый конкретный кубик, с другой стороны время решения задачи (aka построения дома) при черезчур мелких кубиках стремительно растет. Именно поэтому необходимо искать некий наиболее удачный промежуточный размер.
Между строительством домика и складыванием кубиков программистами есть существенная разница. Каменщик не может сложить из 5 кирпичей блок и дальше использовать только его, а программист может. Поэтому черезмерное дробление не представляет фатальной проблемы.

softwarerХм. "Использовать кубик неправильно" - имхо несколько бессмысленное словосочетание, приобретающее смысл только в неправильных кубиках.
Хм. Кубики ака микросхемы существенно большим количеством способов можно использовать не правильно, чем правильно.
А что бы использовать их правильно, нужно _знать как_.
Мне кажется аналогия с программированием здесь уместа.

softwarerЭто другая грань той же проблемы; правильный кубик, используя в соответствии с публикуемым им интерфейсом, просто невозможно использовать "неправильно".
Если публикуемым интерфейсом называть public члены класса, то не согласен.
В этом случае кубиков, которых невозможно использовать неправильно, либо не существует, либо существует очень мало.
Пользованию _любым_ компонентом нужно учиться. Особенно если скакать с языка на язык, т.к. приёмы принятые в различных коммунити различаются.
Называть кубик "правильным" только из-за того, что на интуитивном уровне понятно как его использовать не совсем правильно, поскольку это сугубо субъективная оценка.

Каждый кубик реализует некий интерфейс (в широм смысле этого слова).
Интерфейс включает в себя пред и пост условия методов, инварианты класса, ограничения на возможные значения параметров методов и полей класса. Сюда же можно добавить предполагавшиеся при разработке сценарии использования.
Если программист начинает делать с компонентом что-то, что не описывается в интерфейсе, он использует компонент _неправильно_.

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

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

Разарботка "простого" кода и "универсального" требует существенно разного вклада труда и времени.
На этом разрыве кормятся refactoring и паттерны ооп, развивающие идею повторного использования уже написанного кода через copy-paste.


Про SQL:
softwarer
Кроме того, существует определенная иерархия инкапсуляции внутри объекта-схемы - скажем, таблица предоставляет свой интерфейс (поля, методы для запроса-изменения), но скрывает детали реализации (индексы, ограничения). Наконец, существует естественный уровень абстрагирования, интерфейсы "по имени" - скажем, я в любой момент могу переименовать таблицу, создать view с тем же именем, и все ранее табличные операции будут работать с этим view. Ну, пакеты предоставляют просто-таки классическую инкапсуляцию (и без них программировать уже.. очень тоскливо).

Речь шла именно об этом (хотя акробатические упражнения с view'ками, ролями и сторед процедурами дело, безусловно, занимательное): интерфейс таблицы это все её поля + констрейнты на эти поля.

Сокрытие данных и построение эффективных sql запросов вступают друг с другом в конфликт. Так?

softwarer
NotGonnaGetUsЕсли требуется открыть доступ только наследникам класса, что вполне "правильное"(?) желание, то сделать этого не получится.
Ну, это всего лишь дружественность, которую, с моей точки зрения, стоило бы выбросить и из дельфы, и из явы, и из плюсов.
Т.е. это было плохое желание и видимость должны быть только public и private?

softwarerЕсли я решил взять пакет X.Y.Z и отрефакторить его на X.Y.Z.T1, X.Y.Z.T2 и X.Y.Z.T3, это запросто приведет к вороху ошибок недоступности.
Пакеты отдельная песня.


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


Небольшое уточнение.

Речь идёт о визуальном редакторе html документов (кем и когда писался не знаю).
В наличии имелись сильно связанные классы Workspace и Container.
Workspace имеет нескольких наследников и содержит код манипулирующий Container'ом (модификация и отрисовка). Contianer скрывает хитро организованную структуру из двусвязных индексированных списков двухсвязных индексированных списков :)(параграф/строка/слово/символ/element+style) .

Нужно было заменить реализацию операции undo c полного сохранения содержимого контейнера на сохранение только изменившейся части (из-за out of memory).

Стоит заметить, что кроме операций вставки/удаления были такие операции как форматирование и изменение шрифтов, обратные операции для которых тесно связаны с внутренним устройством контейнера.

Как обычно, искалось решение минимизирующее наведённые ошибки и время на реализацию.

Я согласен, "идеалогически верный паттерновый вариант" более качественное решение, но вопрос был не в этом.

Описанное мной решение имеет право на жизнь (как минимум в виде эволюционного шага на пути к высшему идеалу) и ппп не может его обслужить.


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

Я, в свою очередь, не понимю зачем ограничиваться только этим вариантом.

Суть паттерна - использовать для выбора "алгоритма" полиморфизм вместо условных операторов. C какими данными будет работать алгоритм, закрытыми или открытыми, уже не важно.

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

Мало того, каменщик тоже может. Один из вариантов такого блока и называется панелью ;)

NotGonnaGetUsПоэтому черезмерное дробление не представляет фатальной проблемы.
Фатальной - нет. Но представьте себе, что каждый дом нужно начинать со сборки кирпича из крошек, и только потом этот кирпич можно будет использовать....

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

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

NotGonnaGetUsт.к. приёмы принятые в различных коммунити различаются.
Я не думаю, что "правильность" определяется "принятым в данном коммьюнити". Максимум, что этим определяется - "читаемость" кода; это не единственный критерий качества.

NotGonnaGetUsИнтерфейс включает в себя пред и пост условия методов, инварианты класса, ограничения на возможные значения параметров методов и полей класса.
И методы проверяют эти условия-ограничения, выкидывая исключения. Все корректно.

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

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

NotGonnaGetUsЕсли программист начинает делать с компонентом что-то, что не описывается в интерфейсе, он использует компонент _неправильно_.
Сценарий использования не входит в интерфейс хорошего кубика. Хотя, разумеется, полезна информация вида "если хотите получить А, не забудьте в какой-то момент сделать Б".

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

NotGonnaGetUsУниверсальность может быть только следствием хорошего проектирования.
Нет. Хорошее проектирование недостаточно для универсальности; рискну даже сказать, что оно необязательно. Хотя безусловно полезно.

NotGonnaGetUsРазарботка "простого" кода и "универсального" требует существенно разного вклада труда и времени.
Нет. Разработка универсального кода требует более высокого уровня разработчика при мало отличающихся затратах времени.

NotGonnaGetUsинтерфейс таблицы это все её поля + констрейнты на эти поля.

Сокрытие данных и построение эффективных sql запросов вступают друг с другом в конфликт. Так?
Давайте посмотрим аналогию этого в традиционном ООП.

Допустим, у Вас есть интерфейс "контейнер" и два варианта его реализации; один с O(n) добавлением и O(log n) поиском, другой O(1)/O(n) соответственно. Есть некий код, использующий контейнер. В зависимости от специфики его операций Вы выбираете ту или другую реализацию. И где здесь нарушение инкапсуляции?

NotGonnaGetUs softwarerНу, это всего лишь дружественность, которую, с моей точки зрения, стоило бы выбросить и из дельфы, и из явы, и из плюсов.
Т.е. это было плохое желание и видимость должны быть только public и private?
Ээ... я, кажется, просил выбросить дружественность, а не protected.

NotGonnaGetUsКак обычно, искалось решение минимизирующее наведённые ошибки и время на реализацию.

Я согласен, "идеалогически верный паттерновый вариант" более качественное решение, но вопрос был не в этом.

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

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

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

NotGonnaGetUsСуть паттерна - использовать для выбора "алгоритма" полиморфизм
Безусловно. Полиморфизм - то есть виртуальные методы - это открытая часть объекта, интерфейс. Или мы о виртуальных приватных методах? :)

NotGonnaGetUsвместо условных операторов. C какими данными будет работать алгоритм, закрытыми или открытыми, уже не важно.
Как раз важно. Если алгоритм пытается работать с закрытыми данными - значит, в нем не удастся обойтись без условного оператора типа "если класс X, то берем его закрытое данное Y, иначе Z".

Почему: потому что реализация может быть изменена. Даже если в далеком потомке Xn есть данное Y - не факт, что оно используется; возможно, что оно тупо унаследовано, а реализация давно опирается на Yn. То есть алгоритм, паттерн "Стратегия" теряет свою универсальность, теряет возможность работать с произвольным подставляемым потомком.

NotGonnaGetUsСтратегия это метод превращённый в объект.
Допустим. Хотя это несколько отдает в философию.

NotGonnaGetUsТак же как метод - часть класса, так же и стратегия - часть класса.
Нет, не так же. Стратегия - это обобщенный алгоритм, метод - максимум конкретная реализация обобщенного алгоритма.

Давайте снова посмотрим на стратегию "Сортировка". Ее можно применить очень много к чему; это не есть, допустим, "часть класса ResultSet" или "часть класса DefaultListModel".

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

NotGonnaGetUsЯ использовал слова "один правильный класс" для обозначения этой связности, не более того.
Хм. С этой точки зрения любая программа является "одним правильным классом".
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33704231
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerМало того, каменщик тоже может. Один из вариантов такого блока и называется панелью ;)

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

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

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


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

softwarer NotGonnaGetUsИнтерфейс включает в себя пред и пост условия методов, инварианты класса, ограничения на возможные значения параметров методов и полей класса.
И методы проверяют эти условия-ограничения, выкидывая исключения. Все корректно.
Если в комментарии к методу написано "проверь ограничения прежде чем меня дёргать", то метод НИЧЕГО НИКОМУ не должен.
Мы уже об этом говорили раньше и так не пришли к взаимному понимаю :)

Если программист привык к опередлённым шаблонам, ожидал встретить их же в другой среде и не встертил, виноват он сам.


softwarer
NotGonnaGetUsСюда же можно добавить предполагавшиеся при разработке сценарии использования.
А вот с этим нужно очень аккуратно. Понятно, что в любом случае предполагается какой-то сценарий, но если программист закладывается на "здесь играем, здесь переворачиваем", получается автоматически рассыпающийся код.

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


Ну и хрен с этими параметрами, если код будет работать, т.к. работать он начнёт существенно быстрее. После этого 10 минут на рефакторинг и методы с большим количеством параметров превратятся несколько классов с небольшими, понятными методами.
Если культурный уровень программиста высок, то он никогда не пропустит последний шаг. Если пропустит - уволить.

softwarer
Сценарий использования не входит в интерфейс хорошего кубика. Хотя, разумеется, полезна информация вида "если хотите получить А, не забудьте в какой-то момент сделать Б".

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


softwarer
Нет. Хорошее проектирование недостаточно для универсальности; рискну даже сказать, что оно необязательно. Хотя безусловно полезно.

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

Кто-нибудь ещё в это верит?

softwarer
Давайте посмотрим аналогию этого в традиционном ООП.

Я разве просил привести аналогию?

softwarer
NotGonnaGetUs softwarerНу, это всего лишь дружественность, которую, с моей точки зрения, стоило бы выбросить и из дельфы, и из явы, и из плюсов.
Т.е. это было плохое желание и видимость должны быть только public и private?
Ээ... я, кажется, просил выбросить дружественность, а не protected.

Ну объясните же мне, глупому, что такое дружественность?
А то все мои догадки о том, что же вы вмещаете в это слово не находят подтверждения.


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

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

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

Только не надо предлагать всё засунуть в один пакет.



softwarer
NotGonnaGetUsЯ, в свою очередь, не понимю зачем ограничиваться только этим вариантом.
Потому что это как минимум будет другой паттерн. И я его не то чтобы понимаю.

Это будет ровно тот же паттерн.


softwarer
NotGonnaGetUsСуть паттерна - использовать для выбора "алгоритма" полиморфизм
Безусловно. Полиморфизм - то есть виртуальные методы - это открытая часть объекта, интерфейс. Или мы о виртуальных приватных методах? :)

А? Вы про что?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
   ...
    public   void  megaMethod(){ 
           if  (xxx) {
                yyy;
          }  else  {
                zzz;
          }
   }
   ...

Код: 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.
   ...    
          // где-то в галактике 
           if  (xxx) {
                megaMethod =  new  XXXMegaMethod();
          }  else  {
                megaMethod =  new  NonXXXMegaMethod();
          }
   ...
    public   void  megaMethod(){ 
          megaMethod.megaMethod();
   }
   ...

    class  MegaMethod {
        abstract   void  megaMethod();
   }

    class  XXXMegaMethod{
        void  megaMethod() {
               yyy;
       }
   }
    
    class  NonXXXMegaMethod{
        void  megaMethod() {
               zzz;
       }
   }

softwarer
NotGonnaGetUsвместо условных операторов. C какими данными будет работать алгоритм, закрытыми или открытыми, уже не важно.

Как раз важно. Если алгоритм пытается работать с закрытыми данными - значит, в нем не удастся обойтись без условного оператора типа "если класс X, то берем его закрытое данное Y, иначе Z".

Ерунда. Где этот условный оператор в примере выше?

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

C чего ради деталь реализации должнать обладать мистической универсальностью, простирающейся за границы реализации?

softwarer
NotGonnaGetUsТак же как метод - часть класса, так же и стратегия - часть класса.
Нет, не так же. Стратегия - это обобщенный алгоритм, метод - максимум конкретная реализация обобщенного алгоритма.

Давайте снова посмотрим на стратегию "Сортировка". Ее можно применить очень много к чему; это не есть, допустим, "часть класса ResultSet" или "часть класса DefaultListModel".

Обобщённый алгоритм - это template method. Никто не мешает скрестить Strategy и Template method, для того чтобы осуществлять выбор конкретного template method'a не условными операторами, а за счёт полиморфизма, но почему это должно быть единственным способом использовать паттерн strategy?

softwarer
"Связаны" вовсе не обязательно значит "лазают друг другу в приват".

"Связаны" вовсе не обязательно значит "не лазают друг другу в приват".

softwarer
NotGonnaGetUsЯ использовал слова "один правильный класс" для обозначения этой связности, не более того.
Хм. С этой точки зрения любая программа является "одним правильным классом".
Связь классами бывает разная. Бывают сильно связанные, бывают слабо.
Сильное связывание одно из явлений, с которым надлежит бороться (grasp).
Паттерны ООП, в частности strategy, command, visitor, composite приводят к сильному связыванию, но им это не ставится в вину, т.к. они решают технические задачи, которые не возможно решить стандартными средствами, не ударившись в жёсткий copy-past.
"один правильный класс" это набор таких сильно связаных классов.
Если программа является "одним правильным классом", то модифицировать её задача для сильных духом садомазахистов.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33704711
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsПрограммист может создавать материалы под себя и использовать без повторного процесса сборки.
И? Вы повторили ровно то же, что я сказал в том, на что Вы отвечаете. Не понял, что из этого следует.

NotGonnaGetUsЕсли в комментарии к методу написано "проверь ограничения прежде чем меня дёргать", то метод НИЧЕГО НИКОМУ не должен.
Даже если в комментарии ничего не написано, метод тоже НИЧЕГО НИКОМУ НЕ ДОЛЖЕН.

Вопрос ровно в одном - хороший ли это метод, класс итп. И тут существует простая аналогия: с "Вашей" точки зрения в документации к программе можно написать "не надо нажимать кнопку X в ситуации Y" - и если пользователь таки нажмет ее, программа НИЧЕГО НИКОМУ НЕ ДОЛЖНА.

Я согласен с тем, что такая постановка вопроса в принципе имеет право на существование. Но она - неудобна. И я (да и не только я) полагаю, что ХОРОШАЯ программа ДОЛЖНА обрабатывать ошибки и в целом создавать пользователю максимально простой и удобный контекст работы.

Любой стандартный код - точно такая же программа, которой пользуется "конечный программист". И требования к ней принципиально те же.

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

NotGonnaGetUsНу и хрен с этими параметрами, если код будет работать,
Безусловно. Просто это уже не класс в его нормальном смысле. Это частный случай сомнительной разумности.

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

Как разрабатывать плохие интерфейсы - тема, мне неинтересная, и я ее здесь старательно избегаю. Везде - и в большинстве случаев явно - я говорю о хорошем интерфейсе. Что означает в том числе и "удобный".

NotGonnaGetUs softwarerДавайте посмотрим аналогию этого в традиционном ООП.
Я разве просил привести аналогию?
Я предлагаю Вам ее посмотреть. Этого мало?

NotGonnaGetUsНу объясните же мне, глупому, что такое дружественность?
"Черный ход", благодаря которому можно получить доступ к закрытой информации неродственного класса. В C++ можно явно объявить классы дружественными, после чего они получают возможность лазить друг другу в приват. В дельфе для этого нужно описать классы в одном файле, в яве - в одном пакете.

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

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

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

NotGonnaGetUsВозмите простую библиотеку.
Пусть она состоит из двух пакетов.
Один пакет содержит ссылку на другой пакет, являсь своего рода фасадом для него.
Все что этот фасад скрывает (ссылки на объекты из другого пакета), будут доступны для третьего пакета.

Только не надо предлагать всё засунуть в один пакет.
ППП тут совершенно не при чем. Я не понимаю, нафига может потребоваться описанная конструкция, но если нужна - это претензия к отсутствию в языке понятия "приватного пакета". Да, нет такого. По мне - так и хорошо, что нет. Но в любом случае "классовые" ппп тут ни к селу, ни к городу.

NotGonnaGetUsЕрунда. Где этот условный оператор в примере выше?
Там же, где работа с чужими скрытыми данными.

NotGonnaGetUs softwarerТо есть алгоритм, паттерн "Стратегия" теряет свою универсальность, теряет возможность работать с произвольным подставляемым потомком.

C чего ради деталь реализации должнать обладать мистической универсальностью, простирающейся за границы реализации?
Хм. "На предыдущем допросе" (с) Вы сказали, что суть этого паттерна - в использовании полиморфизма для выбора реализации.

Нельзя ли тогда пояснить, в чем с Вашей точки зрения состоит смысл полиморфизма, если при этом желание использовать потомка вместо предка объявляется "мистической универсальностью"?

NotGonnaGetUsТак же как метод - часть класса, так же и стратегия - часть класса.

Обобщённый алгоритм - это template method. Никто не мешает скрестить Strategy и Template method, для того чтобы осуществлять выбор конкретного template method'a не условными операторами, а за счёт полиморфизма, но почему это должно быть единственным способом использовать паттерн strategy?
Хм. Чтобы сократить объем: даже если это "не единственный" метод, первое процитированное здесь утверждение - на которое я отвечал - уже не верно. Поскольку существует контрпример.

NotGonnaGetUs softwarer
"Связаны" вовсе не обязательно значит "лазают друг другу в приват".

"Связаны" вовсе не обязательно значит "не лазают друг другу в приват".
Безусловно. "Не лазают друг к другу в приват" - означает "нормально спроектированные классы", не более того.

NotGonnaGetUsПаттерны ООП, в частности strategy, command, visitor, composite приводят к сильному связыванию, но им это не ставится в вину, т.к. они решают технические задачи, которые не возможно решить стандартными средствами, не ударившись в жёсткий copy-past.
Пока что это как минимум бездоказательное утверждение.

Судя по всему, Вы сейчас употребляете "сильно связанные" в смысле "может понадобиться лазить друг к другу в приват". Это так?

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

Э... В таком случае, вы повторили ровно тоже, что я сказал, перед тем как вы сказали то, на что я отвечаю :)


softwarer
Я согласен с тем, что такая постановка вопроса в принципе имеет право на существование. Но она - неудобна.
...
Не надо лирики. Если мусоропровод соседской квартиры заканчивается над Вашей кроватью - это не означает, что Вы привыкли к другим шаблонам и сами виноваты. Это означает хреново спроектированный дом.

Не удобна не постановка вопроса, а интерфейс компонента.
А удобство интерфейса, как я уже сказал, отдельная тема.
Если его и обсуждать, то в отдельном топике.

softwarer
NotGonnaGetUsНу и хрен с этими параметрами, если код будет работать, т.к. работать он начнёт существенно быстрее. После этого 10 минут на рефакторинг и методы с большим количеством параметров превратятся несколько классов с небольшими, понятными методами.
Если культурный уровень программиста высок, то он никогда не пропустит последний шаг. Если пропустит - уволить.

Безусловно. Просто это уже не класс в его нормальном смысле. Это частный случай сомнительной разумности.

А что такое класс в нормальном смысле?
Я думал, что класс это то, что начинется со слов "class Name {" :)

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

Это слово отражает объективную характеристику класса или субъективную?
Если субъективную, к каковым относится и удобство, то не вижу смысла обращать на него внимание.

softwarer
Как разрабатывать плохие интерфейсы - тема, мне неинтересная, и я ее здесь старательно избегаю. Везде - и в большинстве случаев явно - я говорю о хорошем интерфейсе. Что означает в том числе и "удобный".

Как раз это лирика + отдельная тема.

softwarerЯ предлагаю Вам ее посмотреть. Этого мало?
Посмотрел. Инкапсуляция не нарушается.
Просто пример не удобного интерфейса. Программиста обязывают подставлять только определённый тип структуры данных. Это вызвано, скорее всего, плохим проектированием иерархии интерфейсов для этой структуры данных. Если бы были интерфейсы XXX, YYY, ... уточняющие врменные характеристики, то забота о выполение условия перешла бы с плеч программиста на компилятор.
Я не вижу связи с тем, о чём я спрашивал.


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

В java файлы из одного пакета не будут лазить друг другу в приват.

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


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

Нет. Мне нравится вариант предложенный Мейером и реализованный в Eiffel.
Видимости связанной с пакетами не существует. Компонент может быть видим всем, никому или наследникам кого-то (при этом наследник может отказаться от наследства и никто не сможет его после этого прикастить к предку).

softwarer
На декларативном уровне - да. И приводите "не очень хороший" пример этого, в то время как пример хорошего решения той же задачи не упирается в упрекаемую Вами суровость ппп.

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

Как только появляется модификатор видимости связанный с пакетом (т.е. protected и default в java), пакет становится одним из действующих лиц в борьбе за обеспечение инкапсуляции.

Очевидно, что это не единственная функция пакетов, другая это раширение имён классов. Безусловно эти две функции вступают в конфликт.

Я уже упоминал о видимых, но не публикуемых компонентах. В любой библиотеке найдутся "недокументированные возможности", все те детали реализации, что неудаётся скрыть, используя стандартные механизмы.
Примером могут служить пакеты sun.*/com.* в jdk.


softwarer
NotGonnaGetUsЕрунда. Где этот условный оператор в примере выше?
Там же, где работа с чужими скрытыми данными.

Работа с чужими данными в вызовах методов yyy и zzz.
А где условный оператор в классах стратегии - не вижу.

(В примере оказались пропущены extends MegaMethod и не обзначен тот факт, что эти классы обхявлены внутри класса-контекста, хотя полагаю это и так понятно)

softwarer
Хм. "На предыдущем допросе" (с) Вы сказали, что суть этого паттерна - в использовании полиморфизма для выбора реализации.

Нельзя ли тогда пояснить, в чем с Вашей точки зрения состоит смысл полиморфизма, если при этом желание использовать потомка вместо предка объявляется "мистической универсальностью"?

У полиморфизма нет смысла.

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

Разве в примере, который я привёл, не видно использования полиморфизма в самой явной его форме?

softwarer
NotGonnaGetUsТак же как метод - часть класса, так же и стратегия - часть класса.

первое процитированное здесь утверждение - на которое я отвечал - уже не верно. Поскольку существует контрпример.

Это утверждение использовалось в том же контексте, в котором использовались слова "один правильный класс". С этой метафорой вы согласились, какие проблемы вызывает эта?

Второе процитированное утверждение кажется мне более интересным.

softwarer
Безусловно. "Не лазают друг к другу в приват" - означает "нормально спроектированные классы", не более того.

"Хоть горшком назови, только в печку не суй" :)

softwarer
NotGonnaGetUsПаттерны ООП, в частности strategy, command, visitor, composite приводят к сильному связыванию, но им это не ставится в вину, т.к. они решают технические задачи, которые не возможно решить стандартными средствами, не ударившись в жёсткий copy-past.
Пока что это как минимум бездоказательное утверждение.

В чём его бездоказательность?

Допустим у вас стратегия с десятью методами и 256 вызовами этих методов.
Отказавшись от данного паттерна вы получите 256 строчек подобного вида
if () {...} else if () {...} ... ,
где вместо "..." вызовы методов утильного класса с параметром ввиде объекта-контекста. К чему приводит такое дублирование всем известно. Это объективный недочёт, в отличии от субъективных оценок, таких как красота расстановки фигурных скобок.


softwarer
Судя по всему, Вы сейчас употребляете "сильно связанные" в смысле "может понадобиться лазить друг к другу в приват". Это так?

Я употребляю это выражение противоположном смысле к "low coupling", одному из шаблонов GRASP.

http://ooad.asf.ru/patterns/patterninfo.asp?id=31
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33705154
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs softwarerЯ предлагаю Вам ее посмотреть. Этого мало?
Посмотрел. Инкапсуляция не нарушается.
Просто пример не удобного интерфейса. Программиста обязывают подставлять только определённый тип структуры данных. Это вызвано, скорее всего, плохим проектированием иерархии интерфейсов для этой структуры данных. Если бы были интерфейсы XXX, YYY, ... уточняющие врменные характеристики, то забота о выполение условия перешла бы с плеч программиста на компилятор.
Я не вижу связи с тем, о чём я спрашивал.

Отвечал по памяти, пример в ней исказился и ответ оказался несколько вне темы, хотя суть это не меняется ^)

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

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

Я возразил: сказал, что разницы нет, и панель - как раз такой вот "заранее сложенный каменщиком кубик", который он использует. Вы по сути проигнорировали это возражение, снова сказав "молдавские строители оценили бы, что программист может использовать свои материалы". Я выделил из этого "программист может использовать" и указал, что это не содержит новой мысли :) Спор о том, использует ли новые материалы каменщик, предлагаю не развивать как сильно оффтопичный и ненужный.

NotGonnaGetUsНе удобна не постановка вопроса, а интерфейс компонента.
Постановка вопроса - "хороший кубик". Поставлена она, если мне не изменяет память, мной. В "мой хороший кубик" "хороший интерфейс" входит, и является одним из двух-трех важнейших факторов.

NotGonnaGetUsА что такое класс в нормальном смысле?
Я думал, что класс это то, что начинется со слов "class Name {" :)
Со слов "class Name {" может начинаться любая хрень К примеру,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 class  Bad1 {  static   public  String get1() { return  "1";}}
 class  Bad2 {  static   public  String get2() { return  "2";}}
 class  Bad3 {  static   public  String get3() { return  "3";}}

 class  Deriver {
   static   public  String derive ( int  mode) {
     switch  (mode) {
       case   1 :  return  Bad1.get1();  break ;
       case   2 :  return  Bad2.get2();  break ;
       case   3 :  return  Bad3.get3();  break ;
       else   return   null ;
    }
  }
}

NotGonnaGetUs softwarerВы случайно не обратили внимания на слово "хорошего"?
Это слово отражает объективную характеристику класса или субъективную?
Если субъективную, к каковым относится и удобство, то не вижу смысла обращать на него внимание.
Хм. Я не очень понимаю, зачем Вам разговаривать со мной, если Вы при этом предпочитаете не обращать внимания на мой слова.

В этом случае я бы предпочел, чтобы Вы адресовали свои монологи в пространство, не отвлечая меня.

NotGonnaGetUsКак раз это лирика + отдельная тема.
Безусловно. И поэтому я предлагаю не тратить на "плохие интерфейсы" время.

NotGonnaGetUsПосмотрел. Инкапсуляция не нарушается.

Позволю себе вставить в это месте последнюю версию Вашего ответа.

NotGonnaGetUsСитуация, когда разработчик выбирает между, скажем, ArrayList и LinkedList не содержит в себе ничего противозаконного. "Противозаконное" начинается, когда выбрав подходящий для себя вараинт, он делает каст в List и дальше обращается с коллекцией через этот интерфейс. Противозанонность заключена в том, что он сам должен контролировать, что в переменной типа List не окажется лист не того вида.
Я скорее не согласен с такой постановкой вопроса. Соображение резонно, но в определенном контексте - если предположить, что некоторое решение, например ArrayList, заведомо лучше и является единственным возможным вариантом. Есть другой контекст, когда выбор реализации диктуется не нами, а тем, кто пользуется нашим решением - скажем, тот же класс "сортировщик" должен работать через List, в то время как пользователь нашего класса - выбирать реализацию исходя из своих данных и своих задач.

Если помните, мы пришли к этому примеру от БД. Что у нас есть в случае БД?

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

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

NotGonnaGetUsВ java файлы из одного пакета не будут лазить друг другу в приват.
Да. Но тем не менее, это практически та же дружественность, со всеми ее минусами. Если угодно, можно считать "чуть менее страшная".

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

Названное Вами желание с моей точки зрения разумно и правильно.

NotGonnaGetUsНет. Мне нравится вариант предложенный Мейером и реализованный в Eiffel.
Видимости связанной с пакетами не существует. Компонент может быть видим всем, никому или наследникам кого-то
Не знаю Eiffel, но в сказанном наши вкусы полностью совпадают.

NotGonnaGetUs(при этом наследник может отказаться от наследства и никто не сможет его после этого прикастить к предку).
Смысла вот этого я не понимаю. Есть подозрение, что такое желание есть следствие желания применить наследование как замену включению. Впрочем, это отдельная и наверное не столь важная тема.

NotGonnaGetUsКак только появляется модификатор видимости связанный с пакетом (т.е. protected и default в java), пакет становится одним из действующих лиц в борьбе за обеспечение инкапсуляции.
Хм. Я не хочу комментировать эту фразу - имхо она не очень относится к сказанному мной. Просто еще раз, аккуратнее сформулирую:

С моей точки зрения, приведенный Вами пример (если предположить, что такой дизайн зачем-то нужен - я смысла в этом не вижу) никак не относится к модификаторам видимости членов класса (то, о чем идет речь в топике). На самом деле он требует введения в язык модификатора видимости пакета [то есть что-то типа protected package] либо доработки модификаторов видимости класса в целом. .

NotGonnaGetUsЯ уже упоминал о видимых, но не публикуемых компонентах. В любой библиотеке найдутся "недокументированные возможности", все те детали реализации, что неудаётся скрыть, используя стандартные механизмы. Примером могут служить пакеты sun.*/com.* в jdk.
Я уже достаточно отошел от java, чтобы не суметь поддержать дискуссию о конкретных решениях в ее библиотеке. Могу сказать так: мне ни разу в жизни не приходилось делать такие вот "вынужденно открытые" решения. Каждый раз, когда я натыкался на чье-либо желание такого решения, оказывалось, что причина его кроется в недостаточной продуманности, плохом дизайне предыдущих решений. Исходя из этого я склонен и неизвестные мне "неудается скрыть" предполагать относящимися к этой категории.

NotGonnaGetUsРабота с чужими данными в вызовах методов yyy и zzz.
Где? Они, я так надеюсь, работают со своими собственными данными каждый. То, что эти данные - чужие для того megaMethod, который метод, имхо по барабану всем, включая его самого.

NotGonnaGetUs(В примере оказались пропущены extends MegaMethod и не обзначен тот факт, что эти классы обхявлены внутри класса-контекста, хотя полагаю это и так понятно)
Хм. И с чьими все-таки закрытыми данными они работают? Контекста? А зачем им это?

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

NotGonnaGetUsЭто утверждение использовалось в том же контексте, в котором использовались слова "один правильный класс". С этой метафорой вы согласились, какие проблемы вызывает эта?
Я привел пример. Сортировка - точно не является частью конкретного класса. Либо мы считаем ее размазанной по куче самых разных классов, либо - что имхо правильнее - считаем ее отдельной сущностью, применимой к разным классам.

NotGonnaGetUsВ чём его бездоказательность?
В отсутствии доказательств :) Сделано сомнительное утверждение, скорее несколько утверждений, и они не обоснованы. По ходу предыдущей дискуссии попытка дать пример такого обоснования... пока не очень успешна, во всяком случае единственный пример был опровергнут.

NotGonnaGetUsДопустим у вас стратегия с десятью методами и 256 вызовами этих методов.
Отказавшись от данного паттерна вы получите 256 строчек подобного вида
if () {...} else if () {...} ... ,
Хм. Знаете, "страшные if-ы" по моим ощущениям давно стали некоторой страшилкой, которую повторяют на все лады, не особо думая о смысле.

Я готов показать, что даже при использовании Fortran IV (который, назовем так, небогат языковыми возможностями, и в том числе не содержит классов) эту задачу можно решить без подобных case-ов. И?

Да, в принципе можно считать любую реализацию "без if-ов" более или менее изуродованным вариантом этого паттерна. Мало того, это часто правильно; к сожалению, очень часто молодые программисты не понимают, что видят перед собой очередную перелицовку проверенных, выведенных из давнего опыта подходов, и считают их революцией, которая спасет мир (и которая позволяет писать как угодно плохо - главное, чтобы звучали слова Strategy, Visitor и прочие).

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


NotGonnaGetUsК чему приводит такое дублирование всем известно. Это объективный недочёт
Хм. Он настолько же объективен, насколько объективен "хороший интерфейс". Однако, тот Вы ранее назвали субъективным.
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33710217
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЯ возразил: сказал, что разницы нет, и панель - как раз такой вот "заранее сложенный каменщиком кубик", который он использует. Вы по сути проигнорировали это возражение
Я как раз на него и ответил :) Каменщик, в отличии от программиста, не делает эту панель, ему её ДАЮТ, так же как и кирпич. Да, давайте не будем о строителях.

softwarerПостановка вопроса - "хороший кубик".
Вы говорите: "'Хорошим' классам хватает возможностей ппп для организации сокрытия реализации, а остальные классы - не интересны".
Я говорю: "Возможности ппп ограничены и там где их не хватает мы разделяем открытые и публикуемые интерфейсы".
Таким образом, с фактом ограниченности ппп и тем, что это не фатальная проблема согласны мы оба (хоть и по разным причинам).
Собственно об этом и шла речь с самого начала.

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

Про инкапсуляцию всё.

----

softwarer
Если помните, мы пришли к этому примеру от БД. Что у нас есть в случае БД?
... И если от этого изменения "накроются" все другие методы, работающие с этой таблицей.... Что Вы там говорили про сильно связанные программы? Именно тот случай. И альтернативы "использованию List" в данном случае имхо нет.
...
класс "сортировщик" должен работать через List, в то время как пользователь нашего класса - выбирать реализацию исходя из своих данных и своих задач.

Аналогию с листом не уловил.

Про БД я начал говорить именно из-за этого "случая". Никто в здравом уме не станет заменять классы на бины с public геттерами и сеттерами и создавать классы со статическими утильными методами (хотя есть и такие примеры реализации ORM :)), но в бд именно это и имеет место, потому что за счёт этого покупается возможность писать эффективные запросы.

Лист.

С каждым листом связан итератор позволяющий перебирать его элементы наиболее эффективным способом.

Поэтой причине сортировщик может быть реализован без знания конкретной реализации листа (так сделано в java).

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

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

softwarer
С моей точки зрения, приведенный Вами пример никак не относится к модификаторам видимости членов класса (то, о чем идет речь в топике). На самом деле он требует введения в язык модификатора видимости пакета [то есть что-то типа protected package] либо доработки модификаторов видимости класса в целом. .

Пакет является ограничителем видимости членов класса (protected, default).
При необходимости сделать какой-то член класса видимым в классе из другого пакета нужно сделать его public, при этом возникает side эффект в виде видимости для всех классов, всех пакетов.
В java избежать этого эффекта практически не возможно.
(так же как delphi нельзя закрыть внтуренности пакета x.y.z от членов пакета x.y)

Мне кажется связь с модификаторам видимости членов класса прямая.


softwarer
Хм. И с чьими все-таки закрытыми данными они работают? Контекста? А зачем им это?

Так вЫшло.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 public   class  X {
      private   int  a;
      private   int  b;
      private  S evaluationStrategy;

      public   int  evaluateSmth() {
           return  evaluationStrategy.eval();
     }
    
      public   void  setSum() {
          evaluationStrategy =  new  Sum();
     }

      public   void  setSub() {
          evaluationStrategy =  new  Sub();
     }

      private   abstract   class  (or  interface ) S {  abstract   int  eval(); }
      private   class  Sum  implements  S {  public   int  eval() {  return  a+b;} }
      private   class  Sub  implements  S {  public   int  eval() {  return  a-b;} }
}
Говорить о разумности примера бесполезно, это просто иллюстрация того, как могут стратегии использовать прайвет данные.

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

Полиморфизм это один из механизмов реализованных в ОО языках.
Кто и как его использует зависит от фантазии.

Можно заменять им условную логику, можно рассматривать как часть механизма наследования.

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


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

Плохой пример.
Универсальная сортировка не является стратегий. Это template method. Можно скрестить его со стратегий, позволив выбирать подходящий template независимо от того, какой лист будет подан на вход алгоритма сортировки. Классы стратегии в таком случае превратятся в "методы" класса сортировщика (а не листа).
Я не вижу смысла в измывании над этим высказыванием.

softwarer
NotGonnaGetUsВ чём его бездоказательность?
В отсутствии доказательств :)
случае единственный пример был опровергнут.

Очень трудно доказывать очевидное :)
Какой пример? Не заметил опровержения.



softwarer
Хм. Знаете, "страшные if-ы" по моим ощущениям давно стали некоторой страшилкой, которую повторяют на все лады, не особо думая о смысле.

Я говорю об if-ах, потому что передомной сейчас проект, где они есть, и мне не надо ничего выдумывать об их смысле.

softwarer
Я готов показать, что даже при использовании Fortran IV (который, назовем так, небогат языковыми возможностями, и в том числе не содержит классов) эту задачу можно решить без подобных case-ов. И?

Мне тоже интересно, какой из этого факта нужно сделать "И?".

softwarer
Да, в принципе можно считать любую реализацию "без if-ов" более или менее изуродованным вариантом этого паттерна. Мало того, это часто правильно; к сожалению, очень часто молодые программисты не понимают, что видят перед собой очередную перелицовку проверенных, выведенных из давнего опыта подходов, и считают их революцией, которая спасет мир (и которая позволяет писать как угодно плохо - главное, чтобы звучали слова Strategy, Visitor и прочие).

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

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

softwarer
NotGonnaGetUsК чему приводит такое дублирование всем известно. Это объективный недочёт
Хм. Он настолько же объективен, насколько объективен "хороший интерфейс". Однако, тот Вы ранее назвали субъективным.
[/quot]
Неа.

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

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

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

NotGonnaGetUsНикто в здравом уме не станет заменять классы на бины с public геттерами и сеттерами и создавать классы со статическими утильными методами (хотя есть и такие примеры реализации ORM :)), но в бд именно это и имеет место, потому что за счёт этого покупается возможность писать эффективные запросы.
Хм. Боюсь, я вроде как знаю все слова, но вот полностью понять смысл фразы не смог. Нельзя ли объяснить более доступно?

NotGonnaGetUsС каждым листом связан итератор позволяющий перебирать его элементы наиболее эффективным способом.

Поэтой причине сортировщик может быть реализован без знания конкретной реализации листа (так сделано в java).
Вы здесь забываете, что кроме эффективного перебора, нужно еще эффективное перестроение. Хотя в java эта проблема относительно неостра из-за "объект есть указатель на объект".

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

Соответственно, если у нас есть, условно говоря, классы "Эффективно Сортируемый Список" и "Неэффективно Сортируемый Список", хороший сортировщик таки должен уметь работать с обоими. В противном случае для сортировки семи строк комбобокса мне придется делать что-нибудь типа

Код: plaintext
comboModel.setItems (  new  ComboItems ( Sorter.sort (  new  EffectiveSortList ( comboModel.getItems()))))

что вряд ли "хорошо".

NotGonnaGetUsЕсли слово "сортировщик" заменить на другое (которому не достаточно итератора), то получится "плохой" дизайн
Я бы не стал утверждать столь однозначно.

NotGonnaGetUsЭто от желания наследовать реализацию, а не интерфейс.
Примерно это я и имел в виду в своей формулировке. Аналог private наследования.

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

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

NotGonnaGetUsи не может обеспечить всё тоже самое, что и наследование (доступ к protected компонентам предка).
Ну, это-то элементарно обходится созданием публикующего нужные вещи потомка.

NotGonnaGetUsПри необходимости сделать какой-то член класса видимым в классе из другого пакета нужно сделать его public, при этом возникает side эффект в виде видимости для всех классов, всех пакетов.
Да. Я поэтому упомянул и дружественность, и protected; фактически Вы хотите нечто типа

Код: plaintext
 protected   package  X.Y.Z friendly to A.B.C, D.E.F

NotGonnaGetUsМне кажется связь с модификаторам видимости членов класса прямая.
См. выше. Это наиболее простой путь реализовать то, что Вы хотите, и модификаторы видимости членов класса тут не роляют.

NotGonnaGetUsТак вЫшло.

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

NotGonnaGetUs private abstract class (or interface) S { abstract int eval(); }
Код: plaintext
1.
 private   abstract   class  S ( public  S (Integer a, Integer b); ...
?

NotGonnaGetUs softwarer
Протестую. Полиморфизм придумали люди, для решения вполне определенных задач. ......

Полиморфизм это один из механизмов реализованных в ОО языках.
Кто и как его использует зависит от фантазии.
Верно. Но если используешь его "от фантазии", неуместно критиковать его за то, что он "не подходит".

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

NotGonnaGetUsЯ не вижу смысла в измывании над этим высказыванием.
OK.

NotGonnaGetUsОчень трудно доказывать очевидное :)
Но надо :)

NotGonnaGetUsКакой пример? Не заметил опровержения.
С undo-контейнером.

NotGonnaGetUsМне тоже интересно, какой из этого факта нужно сделать "И?".
Следующий: не нужно по каждому случаю обсуждения ООП вспоминать про "страшные if-ы". Это такая же страшилка, как goto в структурном программировании.

NotGonnaGetUsПроверенные и выведенные из опыта подходы родили ООП, шаблоны GRASP и GoF, как средства позволяющие их использовать.
Уходить в прошлое и смотреть как эти подходы когда-то пытались реализовывать, интересно только с научно-позновательной точнки зрения.
Хотелось бы согласиться, но к сожалению не получится.

Специфика моего жизненного опыта в том, что я встречал много людей, способных сказать довольно много умных слов на модные темы, но при этом не понимающих сути того, о чем говорят и что страшнее - что вроде бы используют в работе. Скажем, лет дцать назад, когда паттернов еще не было, а модной темой был C++, я беседовал с одним юношей, который влез в тему сверхстандартного учебного задания на полиморфизм - класс "фигура" с наследниками "круг", "квадрат" итп - и начал рассказывать, что все надо делать на template-ах, поскольку только они способны решить эту задачу. В ходе беседы до меня постепенно дошло, что человек просто не понимает классов, для него это скорее записи - благо, если помните, в C++ class и struct весьма похожи.

По моим представлениям, наличие и прискорбная обширность слоя таких людей - следствие изрядной однобокости доступной литературы. Не говоря уже о склонности рекомендовать к чтению "самое крутое", но даже в книгах для начинающих много внимания уделяется "крутым" темам без достаточно глубокого объяснения, без перспективы. С другой стороны, авторы - рассказывающие умные и толковые вещи - чаще всего опускают очевидные с их точки зрения детали, не являющиеся таковыми для не слишком опытного читателя.

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

NotGonnaGetUsПытаться найти и исправить фрагмент логики дублирующийся в 256 местах объективно сложнее, чем сделать исправление в одном единственном месте.
Точно так же, например, "вызвать 256 методов в единственно правильном порядке" объективно сложнее, чем вызвать их в произвольном порядке.

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

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

Это напоминает какую-то странную игру в слова...

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

Разве есть какие-то возражения против того, что инкапсуляция это ппп + п(акет), т.к. два из четырёх модификаторов видимости связаны с пакетами?

softwarer
Хм. Боюсь, я вроде как знаю все слова, но вот полностью понять смысл фразы не смог. Нельзя ли объяснить более доступно?

Бин с гетерами и сеттерами + класс/ы работающие с этим бином.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
     class  YYY {
           private  String XXX xxx;
           public  XXX getXxx(){ return  xxx};
           public   void  setXxx(XXX xxx){ this .xxx = xxx};
   
           private  String ZZZ zzz;
           public  ZZZ getZzz(){ return  zzz};
           public   void  setZzz(ZZZ zzz){ this .zzz = zzz};
    }

    class   YYYHelper/Manager/Utils/* {
          public   int  businessLogic(YYY yyy){
               if  (yyy.getXxx().length() <  10 ) {
                      yyy.setZzz(yyy.getXxx() + yyy.getZzz()) ;
                      yyy.setXxx(yyy.getXxx().substring(yyy.getXxx().length()/ 2 )); 
              }  else  {
                      yyy.setZzz(yyy.getZzz().substring(yyy.getZzz().length()/ 2 ))
              }
               return  yyy.getZzz().length() * yyy.getXxx().length();
         }
   }

Про ORM тоже самое.
Делается бин один к одному по табличке из бд.
Создаются *манагеры, которые делают тоже самое, что и YYYHelper.

Полагаю, найдутся ситуации, где такая "архитектура" уместа, но в общем случае это ахтунг.

softwarer
NotGonnaGetUsС каждым листом связан итератор позволяющий перебирать его элементы наиболее эффективным способом.

Поэтой причине сортировщик может быть реализован без знания конкретной реализации листа (так сделано в java).
Вы здесь забываете, что кроме эффективного перебора, нужно еще эффективное перестроение. Хотя в java эта проблема относительно неостра из-за "объект есть указатель на объект".

Разве это я о чём-то забываю? Мы говорим об алгоритме сортировке.
Итератор в java позволяет выполнять операцию set в текущую позицию.

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

Не знаю о чём вы сейчас пишите...
Если стандартный интерфейс отдать стандартному сортировщику, то он его стандартно отсортирует, при условии, что вы - как программист - не подсунете ему не корректную реализацию стандартного интерфейса (н-р, Read-Only List).

softwarer
Соответственно, если у нас есть, условно говоря, классы "Эффективно Сортируемый Список" и "Неэффективно Сортируемый Список", хороший сортировщик таки должен уметь работать с обоими. В противном случае для сортировки семи строк комбобокса мне придется делать что-нибудь типа

Код: plaintext
comboModel.setItems (  new  ComboItems ( Sorter.sort (  new  EffectiveSortList ( comboModel.getItems()))))

что вряд ли "хорошо".

Я уже не знаю, чего вы хотите добиться :)
Следуя вашей традиции, хочется назвать всё это "плохим" дизайном и попросить не приставать к сортировщику, который честно делает то, что должен - сортирует списки, естественно со всеми теми ограничениями, которые присущи любому template method'y (плата за универсальность, которую вы так любите).

"Плохой" вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
     class  ComboItem  implements  Comparable<ComboItem> {
         public   int  compareTo(ComboItem o) {
            ...
        }
    }

     class  ComboItems  extends  ArrayList<ComboItem> {
        ...
    }

     class  ComboModel {
         private  ComboItems items =  new  ComboItems();

         public  ComboItems getItems() {
             return  items;
        }
    }

     public   void  usage(ComboModel comboModel) {
        Collections.sort(comboModel.getItems()); //эквивалент вашей строчки
    }


"Хороший" вариант:
Код: 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.
     class  ComboItem  implements  Comparable<ComboItem> {
         public   int  compareTo(ComboItem o) {
            ...
        }
    }

     class  ComboItems {
         private  List<ComboItem> items =  new  ArrayList<ComboItem>();

         public   void  sort(){
            Collections.sort(items);
        }
       
         public   void  sort(Comparator<ComboItem> comparator){
            Collections.sort(items, comparator);
        }
        ...
    }

     class  ComboModel {
         private  ComboItems items =  new  ComboItems();

         public  ComboItems getItems() {
             return  items;
        }
    }

     public   void  usage(ComboModel comboModel) {
        comboModel.getItems().sort();  //эквивалент вашей строчки
    }
В обоих нет нужды заниматься шаманством с сортировщиками.

softwarer
NotGonnaGetUsЕсли слово "сортировщик" заменить на другое (которому не достаточно итератора), то получится "плохой" дизайн
Я бы не стал утверждать столь однозначно.

А я бы стал. Могу ещё раз:
Если решим написать "универсальный" метод работающий с объектом реализующим "универсальный" интерфейс, но интерфейс окажется недостаточно продуман (или слишком универсален :)), то получится плохой дизайн, т.к. без костылей в таком случае не обойтись.

softwarer
NotGonnaGetUsи не может обеспечить всё тоже самое, что и наследование (доступ к protected компонентам предка).
Ну, это-то элементарно обходится созданием публикующего нужные вещи потомка.

Ключевое слово "обходится". Прямой путь всегда короче.

offtopic:
Собственно, прелесть Мейера в последовательном подходе к изучении оо метода. Но у этой прелести есть обратная сторона, его идеи нельзя рассматривать раздельно друг от друга - так они теряют смысл.

softwarer
Да. Я поэтому упомянул и дружественность, и protected; фактически Вы хотите нечто типа

Код: plaintext
 protected   package  X.Y.Z friendly to A.B.C, D.E.F

Неа. Я хочу, чтобы пакеты перестали играть роль в обеспечении инкапсуляции,
но хочу этого пассивно. Сделают - хорошо, не сделают - ещё лучше, т.к. более тонкое управление идентификаторами видимости требует большей квалификации, а квалифицированных кадров всегда не хватает.

softwarer
NotGonnaGetUsМне кажется связь с модификаторам видимости членов класса прямая.
См. выше. Это наиболее простой путь реализовать то, что Вы хотите, и модификаторы видимости членов класса тут не роляют.

См.выше. Это не путь, это костыль. Такой же как ООП в скриптовых языках.


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

Давайте ещё раз.

Между "абстрактным" хорошо и "реальным" хорошо есть разница.

В самом начале нашей дискуссии, я привёл пример решения реальной задачи
(только речь там шла о командах, а не стратегиях).

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

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

Если бы играла роль "абстрактная" хорошесть, надо было бы переписать весь html editor с верху до низу.

softwarer
NotGonnaGetUs private abstract class (or interface) S { abstract int eval(); }
Код: plaintext
1.
 private   abstract   class  S ( public  S (Integer a, Integer b); ...
?


Я тоже хочу задать вопрос
Код: 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.
 public   class  X {
     private   int  a =  1 ;
     private   int  b =  2 ;
     private   int  c =  3 ;
    
     private  S evaluationStrategy =  new  Sum();

     public   int  evaluateSmth() {  return  evaluationStrategy.eval(); }

     public   void  setSum() { evaluationStrategy =  new  Sum(); }

     public   void  setSub() { evaluationStrategy =  new  Sub(); }

     public   void  setC( int  c) {  this .c = c; }

     public   void  foo() {
         if  (c > a * b) {
            a = b + evaluationStrategy.eval();
        }  else  {
            b = a + evaluationStrategy.eval();
        }
    }

    //Тут идёт ещё куча методов где используются а и b...

     private   abstract   static   class  S {  abstract   int  eval(); }
     private   class  Sum  extends  S {  public   int  eval() {  return  a + b; } }
     private   class  Sub  extends  S {  public   int  eval() {  return  a - b; } }
}

vs

Код: 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.
 public   class  X {
     private   int  c =  3 ;

     private  S evaluationStrategy =  new  Sum( 1 ,  2 );

     public   int  evaluateSmth() {  return  evaluationStrategy.eval(); }

     public   void  setSum() { evaluationStrategy =  new  Sum(getA(), getB()); }

     public   void  setSub() { evaluationStrategy =  new  Sub(getA(), getB()); }

     public   void  setC( int  c) {  this .c = c; }

     public   void  foo() { evaluationStrategy.foo(c); }

    //todo: заменить все обращения к A на этот метод
     private   int  getA() {  return  evaluationStrategy.getA(); }

    //todo: заменить все присвоения A на этот метод
     private   void  setA( int  a) { evaluationStrategy.setA(a); }

    //todo: заменить все обращения к B на этот метод
     private   int  getB() {  return  evaluationStrategy.getB(); }

    //todo: заменить все присвоения B на этот метод
     private   void  setB( int  b) { evaluationStrategy.setB(b); }
    
    //Тут идёт ещё куча методов где используются а и b...
}

 abstract   class  S {
     private   int  a;
     private   int  b;

     public  S( int  a,  int  b) {  this .a = a;  this .b = b; }

     public   int  getA() {  return  a; }

     public   void  setA( int  a) {  this .a = a; }

     public   int  getB() {  return  b; }

     public   void  setB( int  b) {  this .b = b; }

     abstract   int  eval();

     public   void  foo( int  c) {
         if  (c > getA() * getB()) {
            setA(getB() + eval());
        }  else  {
            setB(getA() + eval());
        }
    }
}

 class  Sum  extends  S {
     public  Sum( int  a,  int  b) {  super (a, b); }

     public   int  eval() {  return  getA() + getB(); }
}

 class  Sub  extends  S {
     public  Sub( int  a,  int  b) {  super (a, b); }

     public   int  eval() {  return  getA() - getB(); }
}

Я полагаю, что второй вариант для вас более "хорош"?

softwarer
NotGonnaGetUsМне тоже интересно, какой из этого факта нужно сделать "И?".
Следующий: не нужно по каждому случаю обсуждения ООП вспоминать про "страшные if-ы". Это такая же страшилка, как goto в структурном программировании.

Повторюсь: я вижу эти if-ы в текущем проекте. Это реальность (в отличии от goto, которые я видел последний раз в qbasic'e 10 лет назад).

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

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

Из ваших уст это звучит как приговор ООП :)


softwarer
Точно так же, например, "вызвать 256 методов в единственно правильном порядке" объективно сложнее, чем вызвать их в произвольном порядке.

Объективно сложенее сделать так, чтобы вызов произвольном порядке был равнозначен вызову в правильном порядке, чем сделать вызов в правильном порядке (мы ведь не допустим, чтобы "правильный порядок" дублировался в коде?) :)

softwarer
NotGonnaGetUs
Про один и тот же интерфейс могут быть противоположные точки зрения.
Хм. Не так сложно построить пример, где применение паттерна "Стратегия" будет явно неуместным усложнением программы, в то время как условный оператор будет оптимальным решением.
Безусловно. А как это связано с тем, что один и тот же интерфейс может быть одновременно удобным и не удобным для разных людей?
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #33715315
Фотография Lamer@fools.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyиногда хочется не перекрыть, а тупо вызвать protected метод...
а то мли в каком-то DevEx метод определения высоты строки (кажись) -
protected, и значитца чтобы таки эту высоты посчитать - пиши давай, по
образу и подобию (благо сорцы под руками). Дык эта падла ж считает
данные на основании опять-таки protected свойств! туды его в качель....

Недавно столкнулся с аналогичной хренью в Infragistics для .NET. Очень нужное свойство для исправления какого-то бага было internal. Слава Аллаху за наличие в .NET пространства имён System.Reflection и класса System.Type ;o)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Ставлю под сомнение полезность private, public и protected
    #35253340
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misheloshiЗаходите! Просто дочитайте все до конца. Все не сложно. здесь все описано.не пожелейте 5 минут. вчера 54 бакса заработал. doxodgold.ru

Лучше ты к нам. Почитай про public, protected, private.
Доход 150 баксов в день обеспечен!
...
Рейтинг: 0 / 0
Ставлю под сомнение полезность private, public и protected
    #35254623
pu61ic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SarinНачинайте бить. Только не больно. Надеюсь найдутся соратники.

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


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