Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.29;
Скачать: CL | DM;

Вниз

private-зона как вселенское зло   Найти похожие ветки 

 
TUser ©   (2009-01-15 12:50) [0]

Ну вот хочется мне, допустим, чему-нибудь там что-нибудь присвоить, или кого-нибудь там вызвать. Бывает. Так нет же. Приват. Не трожь руками генофонд. А почему?

Вот модуль. Сделанный года 4 назад. Когда и мысли не возникало о необходимости вызова метода ХХХ. Ну, не было такой задачи. А теперь - модуль переписывать. Немного, но обидно.

Да, я понимаю свою заботу 4-летней давности. Все внутреннее внутрь. Как же. А вот зачем? Чтобы глупый пользователь не вызвал? Ну, ёлы палы, назвать этот метод не ХХХ, а _ХХХ, или _DO_NOT_CALL_XXX для совсем дебилов. Ну все равно ж совсем дебил вызовет. Исходники поправит накрайняк (они, разумеется, доступны). А умный не вызовет. Или хотя бы подумает, и вызовет осознанно.

Ну, зачем, зачем сознательно ограничивать свободу??????


 
tesseract ©   (2009-01-15 12:52) [1]


> Ну, зачем, зачем сознательно ограничивать свободу??????


Свобода есть разумные ограничения - вроде Линкольн.
Жень это судьба такая.


 
Ega23 ©   (2009-01-15 13:06) [2]

Перенеси в protected, какие проблемы?


 
tesseract ©   (2009-01-15 13:09) [3]


> Перенеси в protected, какие проблемы?


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


 
Anatoly Podgoretsky ©   (2009-01-15 13:17) [4]


> Свобода есть разумные ограничения - вроде Линкольн.

Дисциплина, как осознаная необходимость.


 
reonid ©   (2009-01-16 00:32) [5]

TUser ©   (15.01.09 12:50)  

>Вот модуль. Сделанный года 4 назад. Когда и мысли не возникало о >необходимости вызова метода ХХХ. Ну, не было такой задачи. А теперь - >модуль переписывать. Немного, но обидно.

В таком случае лучше переписать.

Поверь - ты как автор модуля и ты как его
пользователь - это совсем разные люди.
:-)


 
jack128_   (2009-01-16 00:51) [6]


> Не трожь руками генофонд. А почему?

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


> Ну, зачем, зачем сознательно ограничивать свободу??????

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


 
Marser ©   (2009-01-16 01:06) [7]

А сделать для него обёртку в зоне видимости public? И первоначальная функциональность сохраняется, и цели достигнуты.


 
XentaAbsenta ©   (2009-01-16 01:07) [8]

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


 
Германн ©   (2009-01-16 01:10) [9]


> Marser ©   (16.01.09 01:06) [7]

О и тёзка появился на форуме.
Привет Серёга. Сколько лет сколько зим!

P.S.
Может и газ теперь пойдёт? :)


 
Marser ©   (2009-01-16 02:11) [10]


> Германн ©   (16.01.09 01:10) [9]
>
>
> > Marser ©   (16.01.09 01:06) [7]
>
> О и тёзка появился на форуме.
> Привет Серёга. Сколько лет сколько зим!

Да, здрасте :-)
Тут уж добрая традиция, как я с полуночи ни объявлюсь, меня тёзка всегда встретит... И напоит... Виртуально :-))


 
Джо ©   (2009-01-16 04:59) [11]


> Marser ©   (16.01.09 02:11) [10]
> Тут уж добрая
> традиция, как я с полуночи ни объявлюсь, меня тёзка всегда
> встретит... И напоит... Виртуально :-))

Да не оскудеет чаша твоя, о тезка :-)


 
KSergey ©   (2009-01-16 07:45) [12]

> TUser ©   (15.01.09 12:50)  

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

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

В общем и целом - это 2 разных подхода. Один мы видим в VCL, где все хорошо, но пока стандартная функциональность тебя устраивает. Ну чуть зазочешь шаг вправо-влево - и приехали. Или все переписыывай от TComponent или извращайся обходными медотами, фактически находи какие-нибудь лазейки (зачастую это просто перехват сообщений), постоянно натыкаясь на все новые траблы и недоступностью очередной внутренней переменной.
И вторая парадигма, ее можно наблюдать в MFC, например: в классе есть минимальная обертка, спрятано - минимум, все остальное торчит наружу, вызывать нужные методы в нужном порядке, следить за внутренней целостностью - и т.д.

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


 
TUser ©   (2009-01-16 10:27) [13]

Я все-таки не понимаю, чни private лучше соглашения об именованиях. Дурак (если он дурак) все равно использовать будет. Умный тоже. Только подумает сначала. Называли бы все скрываемые методы с подчеркивания ...


 
oxffff ©   (2009-01-16 10:30) [14]


> Ну, зачем, зачем сознательно ограничивать свободу??????


Инкапсуляция - кит ООП. Тебе ничего не мешает объявить Friend процедуру в модуле того класса.


 
KSergey ©   (2009-01-16 10:49) [15]

> TUser ©   (16.01.09 10:27) [13]
> Я все-таки не понимаю, чни private лучше соглашения об именованиях.

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


 
TUser ©   (2009-01-16 14:20) [16]

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


 
KSergey ©   (2009-01-16 15:48) [17]

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

Так и тут.

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

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


 
Alkid ©   (2009-01-16 15:51) [18]

Собственно, не нравится инкапсуляция - не пользуйся :) Делай всё public и не парься. Заодно много новых и интересных слов узнаешь от людей, которым выпадет с твоим кодом работать :)


 
Игорь Шевченко ©   (2009-01-16 16:14) [19]


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


от подчеркиваний это не зависит


 
Дуб ©   (2009-01-16 16:33) [20]

> Alkid ©   (16.01.09 15:51) [18]

Вот. Это самый правильный способ проверить свою философию. :)

А еще можно писать все без классов, в своих юнитах рекордами и процедурами. А для придания красоты пользовать {$i бла-бла}.

Тогда можно о себе многое узнать. От других. Или от себя через пару лет.


 
Ганя   (2009-01-16 17:48) [21]

>>TUser ©   (16.01.09 10:27) [13]
>>Я все-таки не понимаю, чни private лучше соглашения об именованиях.

приблизительно тем же, чем отсутствие в самолете кнопки "уничтожить самолет" лучше ее наличия с табличкой "не нажимать!!! кто нажмет, тот дурак"


 
Ega23 ©   (2009-01-16 17:59) [22]


> TUser ©   (16.01.09 10:27) [13]
>
> Я все-таки не понимаю, чни private лучше соглашения об именованиях.
>  Дурак (если он дурак) все равно использовать будет. Умный
> тоже. Только подумает сначала. Называли бы все скрываемые
> методы с подчеркивания ...


Вот у меня есть класс по обработке документа хитрой структуры. Или ещё чего-нибудь.
Пользователю нужно всего 4 метода и одно свойство:
TMyClass = class (...)
private
 ......
 Хренова гора всего: проверки, парсинг и т.п.
public
 constructor Create;
 destructor Destroy; override;
 
 function LoadFromFile(const FileName : string) : Boolean;
 procedure Print(....);

 property Text : string read GetText;
end;


А в привате - сто тыщь мильёнов вспомогательных методов.
Вопрос: а надо их пользователю видеть?


 
Alkid ©   (2009-01-16 18:09) [23]


> Ega23 ©   (16.01.09 17:59) [22]
> А в привате - сто тыщь мильёнов вспомогательных методов.
> Вопрос: а надо их пользователю видеть?

Олег, ты не понимаешь. Вот есть у тебя в этом классе, скажем, какой-нибудь метод для удобной трансформации какой-нибудь строки в структуру с данными, или сортировки какой-нибудь хитрой или форматирования текста, а тебе потом потребовался этот функционал в другой части программы. Модуль переписывать обидно => рефакторинг - это не для пацанов и вынести нужный функционал в общедоступное место впадлу. Гораздо проще дать доступ к приватным методам :)

P.S. Ну это так, пример только :)


 
Alkid ©   (2009-01-16 18:12) [24]

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


 
KSergey ©   (2009-01-17 13:26) [25]

> Alkid ©   (16.01.09 18:12) [24]
> Только, вот, авторы такого подвоха не ожидали и их детище стало глюкивать.

Бракоделы и ущемители вселенской свободы


 
Городской Шаман   (2009-01-18 02:06) [26]


> TUser ©   (16.01.09 10:27) [13]
>
> Я все-таки не понимаю, чни private лучше соглашения об именованиях.
>  Дурак (если он дурак) все равно использовать будет. Умный
> тоже. Только подумает сначала. Называли бы все скрываемые
> методы с подчеркивания ...


Я стараюсь почти всегда все нужные методы вводить в зону protected и, если они выполняют небанальные действия, объявлять их как virtual. Потом проблем меньше и нарушения целостности нет. Так как доработчик компонента все равно посмотрит как он устроен внутри, а его пользователь не сможет добраться до того что ему не полагается.


 
TUser ©   (2009-01-18 07:40) [27]


> Alkid ©   (16.01.09 18:09) [23]
>
>

Именно так. Или завтра появился документ похожей структуры. Если [26], то мы пишем наследника. А если [22], то переписываем модуль копипастом.


 
Petr V. Abramov ©   (2009-01-18 07:50) [28]


> Alkid ©   (16.01.09 18:09) [23]
> Вот есть у тебя в этом классе, скажем, какой-нибудь метод
> для удобной трансформации какой-нибудь строки в структуру
> с данными, или сортировки какой-нибудь хитрой или форматирования
> текста,

ты, мягко говоря, неправ, что подобные ф-ции засунул в private.


 
Alkid ©   (2009-01-18 15:18) [29]


> Petr V. Abramov ©   (18.01.09 07:50) [28]

Кто ж спорит, неправ. Но это лишь пример того, что не все всегда можно заранее продумать. Обычно это исправляется рефакторингом, но по условиям задачи рефакторинг - западло :)


 
Petr V. Abramov ©   (2009-01-18 15:31) [30]


> Alkid ©   (18.01.09 15:18) [29]

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


 
Alkid ©   (2009-01-18 16:12) [31]


> Petr V. Abramov ©   (18.01.09 15:31) [30]

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


 
Дмитрий Белькевич ©   (2009-01-18 21:19) [32]

>Вопрос: а надо их пользователю видеть?

+1.

>Вот есть у тебя в этом классе, скажем, какой-нибудь метод для удобной трансформации какой-нибудь строки в структуру с данными, или сортировки какой-нибудь хитрой или форматирования текста

Как мы делаем у себя:

Методы класса должны работать только со своими, внутренними данными. Если одинаковая, либо похожая функциональнальность нужна для работы с данными из разных классов, нужно либо сразу писать такие методы как процедуры вне методов, либо позже выносить такие функции наружу метода.

>Модуль переписывать обидно => рефакторинг - это не для пацанов

Для пацанов - говнокодинг. Рефакторинг - это для лохов, это да.


 
Alkid ©   (2009-01-18 22:38) [33]


> TUser ©   (18.01.09 07:40) [27]
> Именно так. Или завтра появился документ похожей структуры.
>  Если [26], то мы пишем наследника. А если [22], то переписываем
> модуль копипастом.

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

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


 
int64   (2009-01-19 12:48) [34]


> TUser ©   (15.01.09 12:50)  

strict private спасет отца русской демократии.


 
int64   (2009-01-19 12:58) [35]

Пару лет назад здесь кем-то поднималась тема:
"Зачем нужна зона private, когда достаточно зоны protected?"
Автору был открыт секрет, что есть более кулльная зона public. Да и public фигня, есть еще круче - publushed.
Вобщем, сошлись на том, что рулят глобальные переменные.


 
Petr V. Abramov ©   (2009-01-19 19:09) [36]


> Alkid ©   (18.01.09 22:38) [33]
> Т.е. наследовать класс "Автомобиль" от класса "Стол", что
> бы повторно использовать функционал для обработки четырёх
> точек опоры я бы не стал

а стол на колесиках? ;)))


 
Дмитрий Белькевич ©   (2009-01-19 22:33) [37]

>Вобщем, сошлись на том, что рулят глобальные переменные.

Эта пять :)


 
Alkid ©   (2009-01-20 11:22) [38]


> Petr V. Abramov ©   (19.01.09 19:09) [36]
> а стол на колесиках? ;)))

Ну, тогда надо делать так:

class WheeledItem;
class Vehicle;
class Furniture;

class WheeledFurniture : public Furniture, public WheeledItem;
class WheeledVeihle : public Vehicle, public WheeledItem;



Страницы: 1 вся ветка

Текущий архив: 2009.03.29;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.021 c
2-1233741002
AlexDan
2009-02-04 12:50
2009.03.29
О операторе if


15-1232271058
visiter
2009-01-18 12:30
2009.03.29
англоязычные форумы dephi


2-1233495081
AlexP
2009-02-01 16:31
2009.03.29
Переключение между приложениями


2-1233134263
DeadMeat
2009-01-28 12:17
2009.03.29
New vs GetMem


15-1232364173
Добежал
2009-01-19 14:22
2009.03.29
Сокрытие курсора с экрана