powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ставлю под сомнение полезность private, public и protected
25 сообщений из 68, страница 1 из 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
25 сообщений из 68, страница 1 из 3
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ставлю под сомнение полезность private, public и protected
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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