Конференция "Прочее" » private-зона как вселенское зло
 
  • TUser © (15.01.09 12:50) [0]
    Ну вот хочется мне, допустим, чему-нибудь там что-нибудь присвоить, или кого-нибудь там вызвать. Бывает. Так нет же. Приват. Не трожь руками генофонд. А почему?

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

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

    Ну, зачем, зачем сознательно ограничивать свободу??????
  • tesseract © (15.01.09 12:52) [1]

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


    Свобода есть разумные ограничения - вроде Линкольн.
    Жень это судьба такая.
  • Ega23 © (15.01.09 13:06) [2]
    Перенеси в protected, какие проблемы?
  • tesseract © (15.01.09 13:09) [3]

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


    Суть она в багах -  private  только в том - же файле перекрывать и повышать видимость можно.
  • Anatoly Podgoretsky © (15.01.09 13:17) [4]

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

    Дисциплина, как осознаная необходимость.
  • reonid © (16.01.09 00:32) [5]
    TUser ©   (15.01.09 12:50)  

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

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

    Поверь - ты как автор модуля и ты как его
    пользователь - это совсем разные люди.
    :-)
  • jack128_ (16.01.09 00:51) [6]

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

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


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

    если есть исходники, то помещение метода в private ничуть не ограничивает твою свободу в его вызове, ведь сорцы ты всегда можешь поменять.  с другой строрны, если ты не хочешь вызывать этот метод(то есть согласен с придуманными тобой же соглашениями), то лудше чтобы за коректностью вызова следил компилер.  Потому что через 4 месяца ты забудешь, что решил не вызывать извне этот метод.
  • Marser © (16.01.09 01:06) [7]
    А сделать для него обёртку в зоне видимости public? И первоначальная функциональность сохраняется, и цели достигнуты.
  • XentaAbsenta © (16.01.09 01:07) [8]
    не в версиях дело, а в подходе. для одиночки может долго сходить с рук такое рукоблудство, а в команде будет пушной зверёк очень скоро.
    ограничивать свободу надо хотябы затем, чтобы установить правила и обозначить рамки, которые приведут к предсказуемости и управляемости.
    Если предсказуемость и/или управляемость будет  потеряна будет загублен проект.
  • Германн © (16.01.09 01:10) [9]

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

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

    P.S.
    Может и газ теперь пойдёт? :)
  • Marser © (16.01.09 02:11) [10]

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

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

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

    Да не оскудеет чаша твоя, о тезка :-)
  • KSergey © (16.01.09 07:45) [12]
    > TUser ©   (15.01.09 12:50)  

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

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

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

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

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


    Инкапсуляция - кит ООП. Тебе ничего не мешает объявить Friend процедуру в модуле того класса.
  • KSergey © (16.01.09 10:49) [15]
    > TUser ©   (16.01.09 10:27) [13]
    > Я все-таки не понимаю, чни private лучше соглашения об именованиях.

    Не, ну так уже несерьезно. Это уже поделки получатся, которые вскоре погрязнут в собственном г.
  • TUser © (16.01.09 14:20) [16]
    Не-г плучается, когда пишут умные люди. Умные люди не будут вызывать заподчеркнутые методы, не подумав.
  • KSergey © (16.01.09 15:48) [17]
    Вот прикинь, сел в авто, дернул ручку - а оно рассыпалось...
    Умный скажет "какого хрена ты ее дергал, она ж красная!"
    Прав ли он будет?

    Так и тут.

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

    Впрочем, это больше философская категория. Каждый делает так, как считает нужным, причем нельзя сказать, что какой-либо из подходов более правильный.
  • Alkid © (16.01.09 15:51) [18]
    Собственно, не нравится инкапсуляция - не пользуйся :) Делай всё public и не парься. Заодно много новых и интересных слов узнаешь от людей, которым выпадет с твоим кодом работать :)
  • Игорь Шевченко © (16.01.09 16:14) [19]

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


    от подчеркиваний это не зависит
  • Дуб © (16.01.09 16:33) [20]
    > Alkid ©   (16.01.09 15:51) [18]

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

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

    Тогда можно о себе многое узнать. От других. Или от себя через пару лет.
  • Ганя (16.01.09 17:48) [21]
    >>TUser ©   (16.01.09 10:27) [13]
    >>Я все-таки не понимаю, чни private лучше соглашения об именованиях.

    приблизительно тем же, чем отсутствие в самолете кнопки "уничтожить самолет" лучше ее наличия с табличкой "не нажимать!!! кто нажмет, тот дурак"
  • Ega23 © (16.01.09 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 © (16.01.09 18:09) [23]

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

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

    P.S. Ну это так, пример только :)
  • Alkid © (16.01.09 18:12) [24]
    Кстати, реальный случай с прошлой работы - сотрудники одного отдела (отдел А) жалуются на другой отдел (отдел Б), мол библиотека ваша что-то глючит. Пришли ребята из отдела Б разбираться, и что же они видят? Борясь со вселенским злом, ребята из А просто взяли и влезли в код библиотеки, открыв несколько приватных членов классов библиотеки и оперировали ими в обход методов в своё удовольствие. Только, вот, авторы такого подвоха не ожидали и их детище стало поглюкивать. Такие дела.
  • KSergey © (17.01.09 13:26) [25]
    > Alkid ©   (16.01.09 18:12) [24]
    > Только, вот, авторы такого подвоха не ожидали и их детище стало глюкивать.

    Бракоделы и ущемители вселенской свободы
  • Городской Шаман (18.01.09 02:06) [26]

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


    Я стараюсь почти всегда все нужные методы вводить в зону protected и, если они выполняют небанальные действия, объявлять их как virtual. Потом проблем меньше и нарушения целостности нет. Так как доработчик компонента все равно посмотрит как он устроен внутри, а его пользователь не сможет добраться до того что ему не полагается.
  • TUser © (18.01.09 07:40) [27]

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

    Именно так. Или завтра появился документ похожей структуры. Если [26], то мы пишем наследника. А если [22], то переписываем модуль копипастом.
  • Petr V. Abramov © (18.01.09 07:50) [28]

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

    ты, мягко говоря, неправ, что подобные ф-ции засунул в private.
  • Alkid © (18.01.09 15:18) [29]

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

    Кто ж спорит, неправ. Но это лишь пример того, что не все всегда можно заранее продумать. Обычно это исправляется рефакторингом, но по условиям задачи рефакторинг - западло :)
  • Petr V. Abramov © (18.01.09 15:31) [30]

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

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

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

    Совершенно верно, "наружу" должен торчать только корректный интерфейс, который не должен дать возможности привести объект в неконсистентное состояние (с точки зрения корректности программы, либо бизнес-правил).
    Собственно, с автором топика из-за этого и спорим, ибо он утверждает, что запрещать доступ к этим методам не надо а стоит лишь пометить их некоторым образом, что бы разработчики сами не вызывали. Иными словами он предлагает этот контроль перенести механизмов языка в область дисциплины. Я считаю это ошибкой.
  • Дмитрий Белькевич © (18.01.09 21:19) [32]
    >Вопрос: а надо их пользователю видеть?

    +1.

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

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

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

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

    Для пацанов - говнокодинг. Рефакторинг - это для лохов, это да.
  • Alkid © (18.01.09 22:38) [33]

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

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

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

    > TUser ©   (15.01.09 12:50)  

    strict private спасет отца русской демократии.
  • int64 (19.01.09 12:58) [35]
    Пару лет назад здесь кем-то поднималась тема:
    "Зачем нужна зона private, когда достаточно зоны protected?"
    Автору был открыт секрет, что есть более кулльная зона public. Да и public фигня, есть еще круче - publushed.
    Вобщем, сошлись на том, что рулят глобальные переменные.
  • Petr V. Abramov © (19.01.09 19:09) [36]

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

    а стол на колесиках? ;)))
  • Дмитрий Белькевич © (19.01.09 22:33) [37]
    >Вобщем, сошлись на том, что рулят глобальные переменные.

    Эта пять :)
  • Alkid © (20.01.09 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;

 
Конференция "Прочее" » private-зона как вселенское зло
Есть новые Нет новых   [134453   +34][b:0.001][p:0.002]