Ну это никак невозможно. Эти if грубо говоря статусы которые возвращают абсолютно посторонние функции, которые работают с совершенно другими данными и другими классами.
Айтишники на пенсии
Moderator: sss1
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
На самом деле вовсе не обязательно. Отложенная инициализация - вполне нормальное дело, когда есть на то причины. В конструкторе можно инициализировать то, что критично и быстро, а в каком-нибудь init() - то, что делается долго и нудно. Другой вопрос, что если init() - не метод класса, то почти всегда это терминальный рак мозга
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
Упс, прочитал снова, как оно читается, сорри, действительно можно подумать, что "оно" - это вы. Извините, я конечно не это имел в виду. Под "оно" подразумевался ваш подход последних дней, который не включает особого обсуждения по существу дела, зато включает меряние пипи... Я бы конечно не стал вас оскорблять ни при каких обстоятельствах, это жа вся дискуссия просто развлекаловка с познавательным содержанием и все
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
init () конечно метод класса, но дело не в этом. Какой бы у вас не был конструктор, после того как вы его позвала, объект уже есть, но он "недоделанный" Пользоваться им еще нельзя. И это плохо, это тоже самое что иметь неинициализированные данные. Либо ничего не должно быть, либо готовое к употребления - это пойнт, плохо иметь не вэлидные данные в открытом доступе .АццкоМото wrote: ↑18 May 2017 19:08На самом деле вовсе не обязательно. Отложенная инициализация - вполне нормальное дело, когда есть на то причины. В конструкторе можно инициализировать то, что критично и быстро, а в каком-нибудь init() - то, что делается долго и нудно. Другой вопрос, что если init() - не метод класса, то почти всегда это терминальный рак мозга
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
ORLY?
init (p_instance_class );
Честно-пречестно init() это метод класса? Мамой клянетесь?
В тех редких случаях, когда нельзя инициализировать объект во что-то минимально вменяемое и сделать это быстро, и реально нельзя пользваться объектом после создания, но до инициализации, все нормальные люди кидают соответствующий exception, что примерно в 100500 раз лучше NPE/segfault который предлагаете вы.ksi wrote: ↑18 May 2017 19:17 Какой бы у вас не был конструктор, после того как вы его позвала, объект уже есть, но он "недоделанный" Пользоваться им еще нельзя. И это плохо, это тоже самое что иметь неинициализированные данные. Либо ничего не должно быть, либо готовое к употребления - это пойнт, плохо иметь не вэлидные данные в открытом доступе .
Простите, не сдержался. Не позорились бы, по вам не оттоптался уже только ленивый
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
Объект достаточно общий, он используется во многих местах. А те функции, которые поставляют данные для его создания, они совершенно другой природы, в каждом случае разные и используют другие классы. Я слабо представляю, как это может быть вложено в конструктор. Конструктор не может знать, в каких ситуациях его будут звать, это базовая вещь.partner_ca wrote: ↑18 May 2017 19:15Не видя конкретного кода трудно дать конкретные ответы по дизайну. Общий ответ - скорее всего кривой дизайн.
Если даный класс зависит от результов многих функций,то почему
эти "абсолютно посторонние функции" не могут быть вызваны из конструктора?
Или просто не понимание духа С++ и попытка механически добавить классы в классический С-ный код.
Может там вообще никакой класс не нужен?
То, что это С шный метод - безусловно. Но это пример для СК когда указатели могут быть полезны и в С++ несмотря на существующий механизм передачи по референсу.
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
Кстати, в современных языках эта парадигма стирается и вообще становится устаревшей. Например, если в джава-классе A есть метод getSomething(), то из котлина его можно вызвать и как instanceOfA.getSomething(), так и просто instanceOfA.something
Аналогично, нет никакой нужды писать тривиальные геттеры-сеттеры, просто делаешь данные публичными, а если вдруг понадобится - допишешь геттеры-сеттеры, но интерфейс не поменяется
сцуко, светлое будущее наступило. лет через 20 войдет и в стандарт С++. а может и раньше, если старина бьярни присоединится к старине ритчи
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
Это не тот Init. Я думал, что вы имеете в виду init () который обычно (по крайней мере у нас, в энтерпрйсном коде ) зовется после конструктора. Констуктор не может вернуть плохой статус, поэтому он должен быть всегда простой и срабатывать. В сложных классах после констуктора зовется функция init() (метод класса), который заввершает конструирование в нектором плане, но зато не void а может вернуть плохой статус.АццкоМото wrote: ↑18 May 2017 19:23ORLY?
init (p_instance_class );
Честно-пречестно init() это метод класса? Мамой клянетесь?
В тех редких случаях, когда нельзя инициализировать объект во что-то минимально вменяемое и сделать это быстро, и реально нельзя пользваться объектом после создания, но до инициализации, все нормальные люди кидают соответствующий exception, что примерно в 100500 раз лучше NPE/segfault который предлагаете вы.ksi wrote: ↑18 May 2017 19:17 Какой бы у вас не был конструктор, после того как вы его позвала, объект уже есть, но он "недоделанный" Пользоваться им еще нельзя. И это плохо, это тоже самое что иметь неинициализированные данные. Либо ничего не должно быть, либо готовое к употребления - это пойнт, плохо иметь не вэлидные данные в открытом доступе .
Простите, не сдержался. Не позорились бы, по вам не оттоптался уже только ленивый
Какой exception, когда? Ничего не произошло плохого, у вас класс содержит только один Int к примеру. В дефолтном конструкторе он поставился в 0 и вы прекрасно можете работать с объектом этого класса, как у СК в статистике, считать что угодно. И все будет считаться, но только результаты неправильные. Как понять, что объект стал использоваться до того, чем мы это планировали?
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
Это все понятно, не надо мне этого объяснять. То есть то, что вы предлагаете - это скажем завести в классе еще один member mIsIinitialized который 0 по дефолту и который ставится в 1, когда мы реально кладем нормальные занные в объект? А все Get () функции должны проверять этот member и бросать exception (дефолтное значение нельзя, функция которая позвала Get () не будет знать, что была бяка)? Так можно сделать, но сколько лишней работы!partner_ca wrote: ↑18 May 2017 19:24Вот. Типична ошибка С-шника начинающего юзать классы.
Это плохой стиль - иметь публичные поля класа.
Класс - это в первую очередь не открытые данные, а поведение.
А доступ к данным только через геттеры/сеттеры.
Если класс не полностью инициализирован то геттер возвращает some default value или бросает exception.
То есть проблема таки есть и уже дизайнеру решать, как он с ней будет обходиться. Моя задача состояла в том, чтобы привлечь внимание СК к этой вещи, которая возникает часто по жизни.
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
Я не спорю, конечно вставить это в Get () функции было чище и не в C шном стиле.partner_ca wrote: ↑18 May 2017 19:58Но вы же все равно где-то снаружи проверяете инициализацию класа перед обращением к его данным.
Тогда уж лучше делать это в одном месте(геттер) чем во многих местах, где есть обращение к данным класса.
-
- Уже с Приветом
- Posts: 5753
- Joined: 15 Aug 2008 00:52
Re: Айтишники на пенсии
по-моему оба варианты просто ужасны. Судя по:partner_ca wrote: ↑18 May 2017 19:58Но вы же все равно где-то снаружи проверяете инициализацию класа перед обращением к его данным.
Тогда уж лучше делать это в одном месте(геттер) чем во многих местах, где есть обращение к данным класса.
бъект может реально наполняться содержанием... в глубинах многочисленных 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
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
В кои-то веки я с вами соглашусь. Тот init() который имел в виду я - обычная стандартная практика, никаких вопросов к нему нет и быть не может. Тот init() который имели в виду вы - внешняя по отношению к классу функция, с указателем на инстанс в качестве параметра - терминальный рак мозга. Все верно.
Не нужно включать дурачка. Если в классе есть только один int, устанавливаемый в 0 в конструкторе, то никакого init() нам просто не надо. Если же инициализация должна быть отложена и объект неюзабелен в промежутке между созданием и инициализацией, то любая попытка использовать его в это время должна кидать exception. Если только все публичные методы не возвращают статус кодksi wrote: ↑18 May 2017 19:39Какой exception, когда? Ничего не произошло плохого, у вас класс содержит только один Int к примеру. В дефолтном конструкторе он поставился в 0 и вы прекрасно можете работать с объектом этого класса, как у СК в статистике, считать что угодно. И все будет считаться, но только результаты неправильные. Как понять, что объект стал использоваться до того, чем мы это планировали?
Признайтесь честно, вы - альтернативный инстанс ммодел с пофиксанным модулем руцкава йызыка, но со всеми остальными багами left intact?
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
да, я в курсе. они были раньше, но у них традиционно все через жопу слегка. котлин обещает нечто большее - компиляцию хоть в JVM, хоть в JS, хоть в нативный код. и без дурацких __declspecpartner_ca wrote: ↑18 May 2017 21:08У майкрософта есть подобноеhttps://msdn.microsoft.com/en-us/library/yhfk0thd.aspxCode: 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; }
кажыццо, завтра Андрей Бреслав будет выступать на Google IO - может быть интересно
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
Дорогой Аццко, вы можете сколько угодно говорить "он должен кинуть exception!!!!" но никто вам ничего не должен пока вы это не имплементируете. А как это сделать вы не говорите, только надуваетесь и грозите пипискометром. Берите пример с вашего коллеги partner_ca, он понмает проблему, предлагает подходы. А от вас я за эти 2 дня ничего по существу обсуждаемых вопросов не услышал, только ругань, честное слово! Смотрите, Снежная Королева рассердится и превратит вас в ледышку!АццкоМото wrote: ↑18 May 2017 21:16 созданием и инициализацией, то любая попытка использовать его в это время должна кидать exception. Если только все публичные методы не возвращают статус код
Признайтесь честно, вы - альтернативный инстанс ммодел с пофиксанным модулем руцкава йызыка, но со всеми остальными багами left intact?
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
Re: Айтишники на пенсии
Вам что, объяснить, как кинуть эксепшн? Нет, я давно понял, что у вас все запущено, но НАСТОЛЬКО???!!!ksi wrote: ↑18 May 2017 22:47Дорогой Аццко, вы можете сколько угодно говорить "он должен кинуть exception!!!!" но никто вам ничего не должен пока вы это не имплементируете. А как это сделать вы не говорите, только надуваетесь и грозите пипискометром. Берите пример с вашего коллеги partner_ca, он понмает проблему, предлагает подходы. А от вас я за эти 2 дня ничего по существу обсуждаемых вопросов не услышал, только ругань, честное слово! Смотрите, Снежная Королева рассердится и превратит вас в ледышку!АццкоМото wrote: ↑18 May 2017 21:16 созданием и инициализацией, то любая попытка использовать его в это время должна кидать exception. Если только все публичные методы не возвращают статус код
Признайтесь честно, вы - альтернативный инстанс ммодел с пофиксанным модулем руцкава йызыка, но со всеми остальными багами left intact?
Мат на форуме запрещен, блдж!
-
- Уже с Приветом
- Posts: 10063
- Joined: 20 May 1999 09:01
Re: Айтишники на пенсии
Нет, мне непонятно как вы узнаете, что его надо или не надо кидать, ну неужели вы не понимаете проблему? Как вы узнаете в час Ч, что на объекте класса была позвана/не позвана раньше функция, которая его заполнила чем-то приличным, а не просто теми значениями которые дал дефолтный конструктор? У вас есть элегагантное решение, чтобы CK его поняла?
-
- Уже с Приветом
- Posts: 15276
- Joined: 01 Mar 2007 05:18
- Location: VVO->ORD->DFW->SFO->DFW->PDX
-
- Уже с Приветом
- Posts: 2250
- Joined: 15 Aug 2003 15:02
Re: Айтишники на пенсии
Почитайте уже что-нибудь про RAII.ksi wrote: ↑18 May 2017 18:39Что, снова оно, пипиc .. ?АццкоМото wrote: ↑18 May 2017 18:13 Очередной вывих мозга от нашего "шпешалиста" - завести никому не нужный указатель пораньше, держать его нулем без всякой цели три часа до реального создания инстанса, чтобы потом случайно все-таки использовать, проанализировать крэшлог и порадоваться, какой умный, что быстро нашел проблему
Не читайте советские газеты и ksi, просто ради чистоты сознания
А по делу? Объект может реально наполняться содержанием (что сплошь и рядом в вычислительных задачах) в глубинах многочисленных if и while. А может так получиться, что код туда не зайдет, а вы думали что зайдет. Там создать вы его не можете из-за скопа. Когда будем создавать объект?
А чтобы все куда нужно заходило, надо использовать TDD.
"Главная проблема цитат в сети Интернет в том, что люди сразу верят в их подлинность" В.И.Ленин
-
- Уже с Приветом
- Posts: 2250
- Joined: 15 Aug 2003 15:02
Re: Айтишники на пенсии
Выскажу своё мнение:АццкоМото wrote: ↑18 May 2017 19:33Кстати, в современных языках эта парадигма стирается и вообще становится устаревшей. Например, если в джава-классе A есть метод getSomething(), то из котлина его можно вызвать и как instanceOfA.getSomething(), так и просто instanceOfA.something
Аналогично, нет никакой нужды писать тривиальные геттеры-сеттеры, просто делаешь данные публичными, а если вдруг понадобится - допишешь геттеры-сеттеры, но интерфейс не поменяется
сцуко, светлое будущее наступило. лет через 20 войдет и в стандарт С++. а может и раньше, если старина бьярни присоединится к старине ритчи
1. Людям пишущим доступ к полям класса в виде get_field/set_field либо отрывать руки либо назначать терапию, в зависимости от запущенности. Код должен быть оформлен в виде accessors/mutators.
2. На реплику, что это те же тривиальные getters/setters замечу, что а) любой компилятор заоптимизирует их до прямого доступа к полям класса, и б) когда придёт нужда (а она придёт, рано или поздно) вхерачить туда какую-нибудь логику, это будет намного тривиальнее (pun intended) чем рефакторить кучу говнокода с прямым доступом к полям класса.
"Главная проблема цитат в сети Интернет в том, что люди сразу верят в их подлинность" В.И.Ленин