Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.048 c
15-1232655714
Городской Шаман
2009-01-22 23:21
2009.03.29
А можно ли вообще при проектировании драйверов использовать ООП?


2-1233919607
Alexxxx
2009-02-06 14:26
2009.03.29
положение scrollbar


15-1231928448
Riply
2009-01-14 13:20
2009.03.29
Ищу сообщника :)


15-1232736848
Petr V. Abramov
2009-01-23 21:54
2009.03.29
МИЗЕР :)


15-1232633470
Городской Шаман
2009-01-22 17:11
2009.03.29
Вопрос по газовым проточным водонагревателям(колонка).





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский