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

Модератор: sss1

Ответить
ksi
Уже с Приветом
Сообщения: 10067
Зарегистрирован: Чт май 20, 1999 4:01 am

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

Сообщение ksi »

АццкоМото писал(а): Чт май 18, 2017 2:23 pm
ksi писал(а): Чт май 18, 2017 2:17 pm init () конечно метод класса, но дело не в этом.
ORLY?
init (p_instance_class );

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

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

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

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

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

Сообщение ksi »

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

То есть проблема таки есть и уже дизайнеру решать, как он с ней будет обходиться. Моя задача состояла в том, чтобы привлечь внимание СК к этой вещи, которая возникает часто по жизни.
ksi
Уже с Приветом
Сообщения: 10067
Зарегистрирован: Чт май 20, 1999 4:01 am

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

Сообщение ksi »

partner_ca писал(а): Чт май 18, 2017 2:58 pm
ksi писал(а): Чт май 18, 2017 2:49 pmА все Get () функции должны проверять этот member и бросать exception (дефолтное значение нельзя, функция которая позвала Get () не будет знать, что была бяка)? Так можно сделать, но сколько лишней работы!
Но вы же все равно где-то снаружи проверяете инициализацию класа перед обращением к его данным.
Тогда уж лучше делать это в одном месте(геттер) чем во многих местах, где есть обращение к данным класса.
Я не спорю, конечно вставить это в Get () функции было чище и не в C шном стиле.
Аватара пользователя
Alexander Troyansky
Уже с Приветом
Сообщения: 5753
Зарегистрирован: Чт авг 14, 2008 7:52 pm
Контактная информация:

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

Сообщение Alexander Troyansky »

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

Код: Выделить всё

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
Аватара пользователя
АццкоМото
Уже с Приветом
Сообщения: 15276
Зарегистрирован: Ср фев 28, 2007 11:18 pm
Откуда: VVO->ORD->DFW->SFO->DFW->PDX

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

Сообщение АццкоМото »

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

Признайтесь честно, вы - альтернативный инстанс ммодел с пофиксанным модулем руцкава йызыка, но со всеми остальными багами left intact?
Мат на форуме запрещен, блдж!
Аватара пользователя
АццкоМото
Уже с Приветом
Сообщения: 15276
Зарегистрирован: Ср фев 28, 2007 11:18 pm
Откуда: VVO->ORD->DFW->SFO->DFW->PDX

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

Сообщение АццкоМото »

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

Код: Выделить всё

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
Уже с Приветом
Сообщения: 10067
Зарегистрирован: Чт май 20, 1999 4:01 am

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

Сообщение ksi »

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

Признайтесь честно, вы - альтернативный инстанс ммодел с пофиксанным модулем руцкава йызыка, но со всеми остальными багами left intact?
Дорогой Аццко, вы можете сколько угодно говорить "он должен кинуть exception!!!!" но никто вам ничего не должен пока вы это не имплементируете. А как это сделать вы не говорите, только надуваетесь и грозите пипискометром. Берите пример с вашего коллеги partner_ca, он понмает проблему, предлагает подходы. А от вас я за эти 2 дня ничего по существу обсуждаемых вопросов не услышал, только ругань, честное слово! Смотрите, Снежная Королева рассердится и превратит вас в ледышку!
Аватара пользователя
АццкоМото
Уже с Приветом
Сообщения: 15276
Зарегистрирован: Ср фев 28, 2007 11:18 pm
Откуда: VVO->ORD->DFW->SFO->DFW->PDX

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

Сообщение АццкоМото »

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

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

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

Сообщение ksi »

АццкоМото писал(а): Чт май 18, 2017 5:52 pm Вам что, объяснить, как кинуть эксепшн? Нет, я давно понял, что у вас все запущено, но НАСТОЛЬКО???!!!
Нет, мне непонятно как вы узнаете, что его надо или не надо кидать, ну неужели вы не понимаете проблему? Как вы узнаете в час Ч, что на объекте класса была позвана/не позвана раньше функция, которая его заполнила чем-то приличным, а не просто теми значениями которые дал дефолтный конструктор? У вас есть элегагантное решение, чтобы CK его поняла?
Аватара пользователя
АццкоМото
Уже с Приветом
Сообщения: 15276
Зарегистрирован: Ср фев 28, 2007 11:18 pm
Откуда: VVO->ORD->DFW->SFO->DFW->PDX

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

Сообщение АццкоМото »

Реально, было бы апчом говорить. Децат.
Мат на форуме запрещен, блдж!
Аватара пользователя
DVK
Уже с Приветом
Сообщения: 2250
Зарегистрирован: Пт авг 15, 2003 10:02 am

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

Сообщение DVK »

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

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

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

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

Сообщение DVK »

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

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

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

Вернуться в «Пенсии»