Айтишники на пенсии

Moderator: sss1

ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

partner_ca wrote: 18 May 2017 18:59
ksi wrote: 18 May 2017 18:50 Нужен он будет позднее, во многих местах данной функции. Логическое место, где у вас есть доступ к данных, которые позволяют его наполнить содержанием, находиться в другом месте функции, под всякими if. Как и где создавать объект?
"Всякие if" можно (и надо) поместить в конструктор.
Ну это никак невозможно. Эти if грубо говоря статусы которые возвращают абсолютно посторонние функции, которые работают с совершенно другими данными и другими классами.
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: Айтишники на пенсии

Post by АццкоМото »

partner_ca wrote: 18 May 2017 18:59
ksi wrote: 18 May 2017 18:50 Нужен он будет позднее, во многих местах данной функции. Логическое место, где у вас есть доступ к данных, которые позволяют его наполнить содержанием, находиться в другом месте функции, под всякими if. Как и где создавать объект?
"Всякие if" можно (и надо) поместить в конструктор.
На самом деле вовсе не обязательно. Отложенная инициализация - вполне нормальное дело, когда есть на то причины. В конструкторе можно инициализировать то, что критично и быстро, а в каком-нибудь init() - то, что делается долго и нудно. Другой вопрос, что если init() - не метод класса, то почти всегда это терминальный рак мозга
Мат на форуме запрещен, блдж!
ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

АццкоМото wrote: 18 May 2017 19:05
ksi wrote: 18 May 2017 19:03 А разве не вы первый предложили меряться вот ими самыми :D ? Это не ваше :D
Ok, если вы не понимаете, почему предложить померяться письками не есть оскорбление, а вот назвать собеседника "оно" - очень даже, то вам доходчиво объяснит модератор. Всего вам недоброго
Упс, прочитал снова, как оно читается, сорри, действительно можно подумать, что "оно" - это вы. Извините, я конечно не это имел в виду. Под "оно" подразумевался ваш подход последних дней, который не включает особого обсуждения по существу дела, зато включает меряние пипи... :D Я бы конечно не стал вас оскорблять ни при каких обстоятельствах, это жа вся дискуссия просто развлекаловка с познавательным содержанием и все :-)
ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

АццкоМото wrote: 18 May 2017 19:08
partner_ca wrote: 18 May 2017 18:59
ksi wrote: 18 May 2017 18:50 Нужен он будет позднее, во многих местах данной функции. Логическое место, где у вас есть доступ к данных, которые позволяют его наполнить содержанием, находиться в другом месте функции, под всякими if. Как и где создавать объект?
"Всякие if" можно (и надо) поместить в конструктор.
На самом деле вовсе не обязательно. Отложенная инициализация - вполне нормальное дело, когда есть на то причины. В конструкторе можно инициализировать то, что критично и быстро, а в каком-нибудь init() - то, что делается долго и нудно. Другой вопрос, что если init() - не метод класса, то почти всегда это терминальный рак мозга
init () конечно метод класса, но дело не в этом. Какой бы у вас не был конструктор, после того как вы его позвала, объект уже есть, но он "недоделанный" Пользоваться им еще нельзя. И это плохо, это тоже самое что иметь неинициализированные данные. Либо ничего не должно быть, либо готовое к употребления - это пойнт, плохо иметь не вэлидные данные в открытом доступе .
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: Айтишники на пенсии

Post by АццкоМото »

ksi wrote: 18 May 2017 19:17 init () конечно метод класса, но дело не в этом.
ORLY?
init (p_instance_class );

Честно-пречестно init() это метод класса? Мамой клянетесь?

ksi wrote: 18 May 2017 19:17 Какой бы у вас не был конструктор, после того как вы его позвала, объект уже есть, но он "недоделанный" Пользоваться им еще нельзя. И это плохо, это тоже самое что иметь неинициализированные данные. Либо ничего не должно быть, либо готовое к употребления - это пойнт, плохо иметь не вэлидные данные в открытом доступе .
В тех редких случаях, когда нельзя инициализировать объект во что-то минимально вменяемое и сделать это быстро, и реально нельзя пользваться объектом после создания, но до инициализации, все нормальные люди кидают соответствующий exception, что примерно в 100500 раз лучше NPE/segfault который предлагаете вы.

Простите, не сдержался. Не позорились бы, по вам не оттоптался уже только ленивый
Мат на форуме запрещен, блдж!
ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

partner_ca wrote: 18 May 2017 19:15
ksi wrote: 18 May 2017 19:05 Ну это никак невозможно. Эти if грубо говоря статусы которые возвращают абсолютно посторонние функции, которые работают с совершенно другими данными и другими классами.
Не видя конкретного кода трудно дать конкретные ответы по дизайну. Общий ответ - скорее всего кривой дизайн.

Если даный класс зависит от результов многих функций,то почему
эти "абсолютно посторонние функции" не могут быть вызваны из конструктора?

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

То, что это С шный метод - безусловно. Но это пример для СК когда указатели могут быть полезны и в С++ несмотря на существующий механизм передачи по референсу.
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: Айтишники на пенсии

Post by АццкоМото »

partner_ca wrote: 18 May 2017 19:24 А доступ к данным только через геттеры/сеттеры.
Кстати, в современных языках эта парадигма стирается и вообще становится устаревшей. Например, если в джава-классе A есть метод getSomething(), то из котлина его можно вызвать и как instanceOfA.getSomething(), так и просто instanceOfA.something

Аналогично, нет никакой нужды писать тривиальные геттеры-сеттеры, просто делаешь данные публичными, а если вдруг понадобится - допишешь геттеры-сеттеры, но интерфейс не поменяется

сцуко, светлое будущее наступило. лет через 20 войдет и в стандарт С++. а может и раньше, если старина бьярни присоединится к старине ритчи
Мат на форуме запрещен, блдж!
ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

АццкоМото wrote: 18 May 2017 19:23
ksi wrote: 18 May 2017 19:17 init () конечно метод класса, но дело не в этом.
ORLY?
init (p_instance_class );

Честно-пречестно init() это метод класса? Мамой клянетесь?

ksi wrote: 18 May 2017 19:17 Какой бы у вас не был конструктор, после того как вы его позвала, объект уже есть, но он "недоделанный" Пользоваться им еще нельзя. И это плохо, это тоже самое что иметь неинициализированные данные. Либо ничего не должно быть, либо готовое к употребления - это пойнт, плохо иметь не вэлидные данные в открытом доступе .
В тех редких случаях, когда нельзя инициализировать объект во что-то минимально вменяемое и сделать это быстро, и реально нельзя пользваться объектом после создания, но до инициализации, все нормальные люди кидают соответствующий exception, что примерно в 100500 раз лучше NPE/segfault который предлагаете вы.

Простите, не сдержался. Не позорились бы, по вам не оттоптался уже только ленивый
Это не тот Init. Я думал, что вы имеете в виду init () который обычно (по крайней мере у нас, в энтерпрйсном коде :D ) зовется после конструктора. Констуктор не может вернуть плохой статус, поэтому он должен быть всегда простой и срабатывать. В сложных классах после констуктора зовется функция init() (метод класса), который заввершает конструирование в нектором плане, но зато не void а может вернуть плохой статус.

Какой exception, когда? Ничего не произошло плохого, у вас класс содержит только один Int к примеру. В дефолтном конструкторе он поставился в 0 и вы прекрасно можете работать с объектом этого класса, как у СК в статистике, считать что угодно. И все будет считаться, но только результаты неправильные. Как понять, что объект стал использоваться до того, чем мы это планировали?
ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

partner_ca wrote: 18 May 2017 19:24
ksi wrote: 18 May 2017 19:17плохо иметь не вэлидные данные в открытом доступе .
Вот. Типична ошибка С-шника начинающего юзать классы.
Это плохой стиль - иметь публичные поля класа.
Класс - это в первую очередь не открытые данные, а поведение.
А доступ к данным только через геттеры/сеттеры.
Если класс не полностью инициализирован то геттер возвращает some default value или бросает exception.
Это все понятно, не надо мне этого объяснять. То есть то, что вы предлагаете - это скажем завести в классе еще один member mIsIinitialized который 0 по дефолту и который ставится в 1, когда мы реально кладем нормальные занные в объект? А все Get () функции должны проверять этот member и бросать exception (дефолтное значение нельзя, функция которая позвала Get () не будет знать, что была бяка)? Так можно сделать, но сколько лишней работы!

То есть проблема таки есть и уже дизайнеру решать, как он с ней будет обходиться. Моя задача состояла в том, чтобы привлечь внимание СК к этой вещи, которая возникает часто по жизни.
ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

partner_ca wrote: 18 May 2017 19:58
ksi wrote: 18 May 2017 19:49А все Get () функции должны проверять этот member и бросать exception (дефолтное значение нельзя, функция которая позвала Get () не будет знать, что была бяка)? Так можно сделать, но сколько лишней работы!
Но вы же все равно где-то снаружи проверяете инициализацию класа перед обращением к его данным.
Тогда уж лучше делать это в одном месте(геттер) чем во многих местах, где есть обращение к данным класса.
Я не спорю, конечно вставить это в Get () функции было чище и не в C шном стиле.
User avatar
Alexander Troyansky
Уже с Приветом
Posts: 5665
Joined: 15 Aug 2008 00:52

Re: Айтишники на пенсии

Post by Alexander Troyansky »

partner_ca wrote: 18 May 2017 19:58
ksi wrote: 18 May 2017 19:49А все Get () функции должны проверять этот member и бросать exception (дефолтное значение нельзя, функция которая позвала Get () не будет знать, что была бяка)? Так можно сделать, но сколько лишней работы!
Но вы же все равно где-то снаружи проверяете инициализацию класа перед обращением к его данным.
Тогда уж лучше делать это в одном месте(геттер) чем во многих местах, где есть обращение к данным класса.
по-моему оба варианты просто ужасны. Судя по:
бъект может реально наполняться содержанием... в глубинах многочисленных if и while
Нужен он будет позднее, во многих местах данной функции.
может должен быть какой-то другой, не менее ужасный подход:

Code: Select all

MyOfigitelnoComplexStruct &mocs = MyOfigitelnoComplexStruct();
if (!mcs.init())
{
    return FOAD;
}

//далее идёт использование этой ОфигительноСложнойСтруктуры
?
I would hope that a wise white man with the richness of his experiences would more often than not reach a better conclusion than a latina female who hasn't lived that life
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: Айтишники на пенсии

Post by АццкоМото »

ksi wrote: 18 May 2017 19:39 Это не тот Init. Я думал, что вы имеете в виду init () который обычно
В кои-то веки я с вами соглашусь. Тот init() который имел в виду я - обычная стандартная практика, никаких вопросов к нему нет и быть не может. Тот init() который имели в виду вы - внешняя по отношению к классу функция, с указателем на инстанс в качестве параметра - терминальный рак мозга. Все верно.
ksi wrote: 18 May 2017 19:39Какой exception, когда? Ничего не произошло плохого, у вас класс содержит только один Int к примеру. В дефолтном конструкторе он поставился в 0 и вы прекрасно можете работать с объектом этого класса, как у СК в статистике, считать что угодно. И все будет считаться, но только результаты неправильные. Как понять, что объект стал использоваться до того, чем мы это планировали?
Не нужно включать дурачка. Если в классе есть только один int, устанавливаемый в 0 в конструкторе, то никакого init() нам просто не надо. Если же инициализация должна быть отложена и объект неюзабелен в промежутке между созданием и инициализацией, то любая попытка использовать его в это время должна кидать exception. Если только все публичные методы не возвращают статус код

Признайтесь честно, вы - альтернативный инстанс ммодел с пофиксанным модулем руцкава йызыка, но со всеми остальными багами left intact?
Мат на форуме запрещен, блдж!
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: Айтишники на пенсии

Post by АццкоМото »

partner_ca wrote: 18 May 2017 21:08
АццкоМото wrote: 18 May 2017 19:33сцуко, светлое будущее наступило. лет через 20 войдет и в стандарт С++. а может и раньше, если старина бьярни присоединится к старине ритчи
У майкрософта есть подобное

Code: Select all

struct S {
   int i;
   void putprop(int j) { 
      i = j;
   }

   int getprop() {
      return i;
   }

   __declspec(property(get = getprop, put = putprop)) int the_prop;
};

int main() {
   S s;
   s.the_prop = 5;
   return s.the_prop;
}
https://msdn.microsoft.com/en-us/library/yhfk0thd.aspx
да, я в курсе. они были раньше, но у них традиционно все через жопу слегка. котлин обещает нечто большее - компиляцию хоть в JVM, хоть в JS, хоть в нативный код. и без дурацких __declspec

кажыццо, завтра Андрей Бреслав будет выступать на Google IO - может быть интересно
Мат на форуме запрещен, блдж!
ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

АццкоМото wrote: 18 May 2017 21:16 созданием и инициализацией, то любая попытка использовать его в это время должна кидать exception. Если только все публичные методы не возвращают статус код

Признайтесь честно, вы - альтернативный инстанс ммодел с пофиксанным модулем руцкава йызыка, но со всеми остальными багами left intact?
Дорогой Аццко, вы можете сколько угодно говорить "он должен кинуть exception!!!!" но никто вам ничего не должен пока вы это не имплементируете. А как это сделать вы не говорите, только надуваетесь и грозите пипискометром. Берите пример с вашего коллеги partner_ca, он понмает проблему, предлагает подходы. А от вас я за эти 2 дня ничего по существу обсуждаемых вопросов не услышал, только ругань, честное слово! Смотрите, Снежная Королева рассердится и превратит вас в ледышку!
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: Айтишники на пенсии

Post by АццкоМото »

ksi wrote: 18 May 2017 22:47
АццкоМото wrote: 18 May 2017 21:16 созданием и инициализацией, то любая попытка использовать его в это время должна кидать exception. Если только все публичные методы не возвращают статус код

Признайтесь честно, вы - альтернативный инстанс ммодел с пофиксанным модулем руцкава йызыка, но со всеми остальными багами left intact?
Дорогой Аццко, вы можете сколько угодно говорить "он должен кинуть exception!!!!" но никто вам ничего не должен пока вы это не имплементируете. А как это сделать вы не говорите, только надуваетесь и грозите пипискометром. Берите пример с вашего коллеги partner_ca, он понмает проблему, предлагает подходы. А от вас я за эти 2 дня ничего по существу обсуждаемых вопросов не услышал, только ругань, честное слово! Смотрите, Снежная Королева рассердится и превратит вас в ледышку!
Вам что, объяснить, как кинуть эксепшн? Нет, я давно понял, что у вас все запущено, но НАСТОЛЬКО???!!!
Мат на форуме запрещен, блдж!
ksi
Уже с Приветом
Posts: 10086
Joined: 20 May 1999 09:01

Re: Айтишники на пенсии

Post by ksi »

АццкоМото wrote: 18 May 2017 22:52 Вам что, объяснить, как кинуть эксепшн? Нет, я давно понял, что у вас все запущено, но НАСТОЛЬКО???!!!
Нет, мне непонятно как вы узнаете, что его надо или не надо кидать, ну неужели вы не понимаете проблему? Как вы узнаете в час Ч, что на объекте класса была позвана/не позвана раньше функция, которая его заполнила чем-то приличным, а не просто теми значениями которые дал дефолтный конструктор? У вас есть элегагантное решение, чтобы CK его поняла?
User avatar
АццкоМото
Уже с Приветом
Posts: 15242
Joined: 01 Mar 2007 05:18
Location: VVO->ORD->DFW->SFO->DFW->PDX

Re: Айтишники на пенсии

Post by АццкоМото »

Реально, было бы апчом говорить. Децат.
Мат на форуме запрещен, блдж!
User avatar
DVK
Уже с Приветом
Posts: 2225
Joined: 15 Aug 2003 15:02

Re: Айтишники на пенсии

Post by DVK »

ksi wrote: 18 May 2017 18:39
АццкоМото wrote: 18 May 2017 18:13 Очередной вывих мозга от нашего "шпешалиста" - завести никому не нужный указатель пораньше, держать его нулем без всякой цели три часа до реального создания инстанса, чтобы потом случайно все-таки использовать, проанализировать крэшлог и порадоваться, какой умный, что быстро нашел проблему

Не читайте советские газеты и ksi, просто ради чистоты сознания
Что, снова оно, пипиc .. :D ?

А по делу? Объект может реально наполняться содержанием (что сплошь и рядом в вычислительных задачах) в глубинах многочисленных if и while. А может так получиться, что код туда не зайдет, а вы думали что зайдет. Там создать вы его не можете из-за скопа. Когда будем создавать объект?
Почитайте уже что-нибудь про RAII.
А чтобы все куда нужно заходило, надо использовать TDD.
"Главная проблема цитат в сети Интернет в том, что люди сразу верят в их подлинность" В.И.Ленин
User avatar
DVK
Уже с Приветом
Posts: 2225
Joined: 15 Aug 2003 15:02

Re: Айтишники на пенсии

Post by DVK »

АццкоМото wrote: 18 May 2017 19:33
partner_ca wrote: 18 May 2017 19:24 А доступ к данным только через геттеры/сеттеры.
Кстати, в современных языках эта парадигма стирается и вообще становится устаревшей. Например, если в джава-классе A есть метод getSomething(), то из котлина его можно вызвать и как instanceOfA.getSomething(), так и просто instanceOfA.something

Аналогично, нет никакой нужды писать тривиальные геттеры-сеттеры, просто делаешь данные публичными, а если вдруг понадобится - допишешь геттеры-сеттеры, но интерфейс не поменяется

сцуко, светлое будущее наступило. лет через 20 войдет и в стандарт С++. а может и раньше, если старина бьярни присоединится к старине ритчи
Выскажу своё мнение:
1. Людям пишущим доступ к полям класса в виде get_field/set_field либо отрывать руки либо назначать терапию, в зависимости от запущенности. Код должен быть оформлен в виде accessors/mutators.
2. На реплику, что это те же тривиальные getters/setters замечу, что а) любой компилятор заоптимизирует их до прямого доступа к полям класса, и б) когда придёт нужда (а она придёт, рано или поздно) вхерачить туда какую-нибудь логику, это будет намного тривиальнее (pun intended) чем рефакторить кучу говнокода с прямым доступом к полям класса.
"Главная проблема цитат в сети Интернет в том, что люди сразу верят в их подлинность" В.И.Ленин

Return to “Пенсии”