Как назвать метод, который должен быть переопределен
От: Рома Мик Россия http://romamik.com
Дата: 04.04.16 13:26
Оценка:
Вопрос конечно не сюда, но куда не знаю

Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?
Re: Как назвать метод
От: Lazy Bear Канада  
Дата: 04.04.16 15:10
Оценка: 3 (1)
Здравствуйте, Рома Мик, Вы писали:

РМ>Вопрос конечно не сюда, но куда не знаю


РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


userInit
Re: Как назвать метод, который должен быть переопределен
От: Кодт Россия  
Дата: 04.04.16 15:51
Оценка: 3 (1) +2
Здравствуйте, Рома Мик, Вы писали:

РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


В общем виде,
virtual void init_impl() = 0;


А если этот метод специфичен для каждого конкретного класса (например, рукодельная рефлексия), — то так и назвать
virtual void init_type_specific_info() = 0; // TODO override in EVERY subclass
Перекуём баги на фичи!
Re: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 04.04.16 16:09
Оценка: 3 (1) +1 :)
Здравствуйте, Рома Мик, Вы писали:

РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


кэп: InitOverride. Для поклонников Кэррола — InitOverrideMe, разумеется.

В дотнете одно время предлагался суффикс Core, но на практике он оказался удобнее для методов "не лезь, если не хочешь сломать".
Re: Как назвать метод, который должен быть переопределен
От: Berill Азербайджан  
Дата: 11.04.16 13:54
Оценка: 1 (1) +3
Здравствуйте, Рома Мик, Вы писали:

РМ>Вопрос конечно не сюда, но куда не знаю


РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?


Если должен быть переопределен для всех наследников, то может стоит сделать этот метод абстрактным? Это приведет к тому, что класс, от которого должны наследоваться, сам станет абстрактным, и будет выступать в роли шаблона для своих наследников. Тогда мороки с названием и не будет.
Re: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 11.04.16 16:06
Оценка:
Здравствуйте, Рома Мик, Вы писали:
РМ>Допустим есть класс, от которого должны наследоваться другие классы, у него есть публичный метод init, который делает что-то, в том числе вызывает protected метод этого же класса, который должен быть переопределен в дочерних классах. Как назвать этот protected метод?
че-то я старею. так и хочется вскочить и крикнуть, показывая пальцем — наркоман!

такая вещь называется конструктор
Re[2]: Как назвать метод, который должен быть переопределен
От: velkin Удмуртия https://kisa.biz
Дата: 11.04.16 17:30
Оценка:
Здравствуйте, __kot2, Вы писали:

__>че-то я старею. так и хочется вскочить и крикнуть, показывая пальцем — наркоман!

__>такая вещь называется конструктор

Конструктор вызывается при создании объекта (экземпляра класса), деструктор соответственно при уничтожении. Если эти действия нежелательны, то можно наклепать дополнительные методы.
Re[3]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 11.04.16 18:04
Оценка:
Здравствуйте, velkin, Вы писали:
V>Здравствуйте, __kot2, Вы писали:
__>>че-то я старею. так и хочется вскочить и крикнуть, показывая пальцем — наркоман!
__>>такая вещь называется конструктор
V>Конструктор вызывается при создании объекта (экземпляра класса), деструктор соответственно при уничтожении. Если эти действия нежелательны, то можно наклепать дополнительные методы.
ну так конструктор он, соб-но для инициализации обьекта и создан. если вы снова его инициализируете — вы создаете новый обьект.
вы хотите переиспользовать какие-то буферы от другого сконструированного обьекта? ну так передайте их конструктору
Re[4]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 11.04.16 18:30
Оценка:
Здравствуйте, __kot2, Вы писали:

__>ну так конструктор он, соб-но для инициализации обьекта и создан. если вы снова его инициализируете — вы создаете новый обьект.


Конструктор не всегда удобен. Первый пришедший в голову сценарий: дерево компонентов, надо вызывать Init() только после добавления дерева на форму.
Re[5]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 11.04.16 20:24
Оценка: +1
Здравствуйте, Sinix, Вы писали:
S>Конструктор не всегда удобен. Первый пришедший в голову сценарий: дерево компонентов, надо вызывать Init() только после добавления дерева на форму.
это очень плохо, когда у вас допускается обьект в состоянии "не до конца создан", "не совсем убит" или вообще в каком-то невалидном состоянии. ни разу не видел, чтобы это работало надежно. помните, недавний разговор про глюк в скайпе с дублированием контактов? https://community.skype.com/t5/Mac-archive/double-contacts/td-p/629507 это вот как раз оно — сайд-эффекты раздельного вызова init при добавлении компонента в дерево на форму
Отредактировано 11.04.2016 20:42 __kot2 . Предыдущая версия .
Re: Как назвать метод, который должен быть переопределен
От: vsb Казахстан  
Дата: 12.04.16 01:45
Оценка: 3 (1)
Наверное это плохой вариант, но для полноты информации — в Java почему-то часто в таких случаях используют префикс do, например doInit.

В Objective C часто используются имена вроде viewWillLoad/viewDidLoad. Это уже лучше. Т.е. в вашем случае будет что-то вроде objectWillInitialize/objectDidInitialize. Мне этот вариант нравится больше остальных.
Re[2]: Как назвать метод, который должен быть переопределен
От: Рома Мик Россия http://romamik.com
Дата: 12.04.16 07:37
Оценка:
Здравствуйте, __kot2, Вы писали:

__>такая вещь называется конструктор

Иногда бывает так, что конструктор не годится. Или его использование требует каких-то сильно больших телодвижений. В данном случае, объекты создаются, в конструкторе делают некую начальную инициализацию, в том, числе рассказывают какие другие объекты им нужны для продолжения инициализации, и потом в нужном порядке они все инициализируются.
Это можно решить сделав два объекта, и первый будет создавать второй, но и вариант с init тоже есть.
Re[3]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 12.04.16 09:30
Оценка:
Здравствуйте, Рома Мик, Вы писали:
__>>такая вещь называется конструктор
РМ>Иногда бывает так, что конструктор не годится. Или его использование требует каких-то сильно больших телодвижений. В данном случае, объекты создаются, в конструкторе делают некую начальную инициализацию, в том, числе рассказывают какие другие объекты им нужны для продолжения инициализации, и потом в нужном порядке они все инициализируются.
это ужасно, просто ужасно
Re[6]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 12.04.16 09:54
Оценка: +3
Здравствуйте, __kot2, Вы писали:

__>это очень плохо, когда у вас допускается обьект в состоянии "не до конца создан", "не совсем убит" или вообще в каком-то невалидном состоянии.

Это абсолютно нормальное состояние в любом более-менее сложном графе данных.

Простейшие примеры — данные, подтягиваемые через ORM, лениво заполняемые свойства у AST, настраиваемый логгер, объекты, создаваемые через builder pattern и т.д. и т.п.

Но можно начать с стартового примера. Ок, как по-вашему должно инициализироваться дерево UI-компонентов?
С учётом того, что его _сначала_ надо построить, и только затем добавить на форму.


__>ни разу не видел, чтобы это работало надежно.

Ну, если меры по предотвращению заканчиваются на "это ужасно, просто ужасно" — то очевидно да
Если не лениться и приправить код тестами / ассертами + отладочными инвариантами, то ошибки не пройдут
Re[7]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 12.04.16 13:07
Оценка:
Здравствуйте, Sinix, Вы писали:
S>Но можно начать с стартового примера. Ок, как по-вашему должно инициализироваться дерево UI-компонентов?
S>С учётом того, что его _сначала_ надо построить, и только затем добавить на форму.
я просто работал на нескольких подобных проектах еще после универа. UI вообще провоцирует на подобный говнокод. это не значит, что нельзя сделать по-другому. просто вроде как "удобнее" иметь сложную запутанную логику заполнений обьектов и изменений их состояний.
вы никогда не сможете протестировать это автоматически
и вы убьете кучу своего времени, там, месяцы, на то, чтобы заставить это хоть как-то работать
и оно все равно толком работать не будет

поэтому это ужасно, просто ужасно

обьект конструируется в конструкторе. вы можете это сделать по-другому, но на это должна быть веская причина. "мне так удобнее" и "я так привык" это не причина. должна быть причина по котрой вы именно не можете конструировать его в конструкторе и никак не можете обойти это ограничение
Re[8]: Как назвать метод, который должен быть переопределен
От: baily Россия  
Дата: 12.04.16 13:15
Оценка:
Здравствуйте, __kot2, Вы писали:

__>обьект конструируется в конструкторе. вы можете это сделать по-другому, но на это должна быть веская причина. "мне так удобнее" и "я так привык" это не причина. должна быть причина по котрой вы именно не можете конструировать его в конструкторе и никак не можете обойти это ограничение


Вам и привели пример с веской причиной чуть выше. Даже сделали это два раза. Если вы не считаете данную причину веской а относите ее к категории отмазок, то приведите пример, как можно сделать просто и надежно только на конструкторах.
Re[9]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 12.04.16 15:34
Оценка: +1
Здравствуйте, baily, Вы писали:
B>Вам и привели пример с веской причиной чуть выше. Даже сделали это два раза. Если вы не считаете данную причину веской а относите ее к категории отмазок, то приведите пример, как можно сделать просто и надежно только на конструкторах.
и где этот пример интересно? где код?
у меня не такая буйная фантазия, чтобы представить его. я даже не понимаю, разгоор идет о вебе, где нужно транслировать в html, об игре, где каждый кадр все перерисовывается или о простигоссподи windows-MFC со всякими его refresh и update.
в каждом случае будут наркоманские причины использовать частичносозданные обьекты и, если это правда интересно, я могу показать, как это сделал бы здоровый человек
Re[8]: Как назвать метод, который должен быть переопределен
От: Sinix  
Дата: 12.04.16 15:58
Оценка: +1
Здравствуйте, __kot2, Вы писали:

S>>Но можно начать с стартового примера. Ок, как по-вашему должно инициализироваться дерево UI-компонентов?

S>>С учётом того, что его _сначала_ надо построить, и только затем добавить на форму.

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


Конкретику плиз, пример выше Раздел профильный, это не философия для потрындеть и "вот это — отстой" без аргументов не катит

Если конкретики не будет — топик надо в философию снести.
Re[4]: Как назвать метод, который должен быть переопределен
От: Рома Мик Россия http://romamik.com
Дата: 12.04.16 20:36
Оценка:
Здравствуйте, __kot2, Вы писали:

__>>>такая вещь называется конструктор

РМ>>Иногда бывает так, что конструктор не годится. Или его использование требует каких-то сильно больших телодвижений. В данном случае, объекты создаются, в конструкторе делают некую начальную инициализацию, в том, числе рассказывают какие другие объекты им нужны для продолжения инициализации, и потом в нужном порядке они все инициализируются.
__>это ужасно, просто ужасно
На самом деле да. Мне тоже не очень нравится в итоге. Но вариант введения дополнительного класса, который будет хранить параметры инициализации пока они не понадобятся, мне тоже кажется очень плохим, т.к. при создании нового типа объекта придется делать два класса вместо одного, а это морока.
Ну а чтобы избежать проблем недоинициализированные объекты хранятся внутри системы инициализации, которая их не отдает наружу пока они не проинициализируются.
Re[5]: Как назвать метод, который должен быть переопределен
От: __kot2  
Дата: 13.04.16 00:23
Оценка:
Здравствуйте, Рома Мик, Вы писали:
РМ>На самом деле да. Мне тоже не очень нравится в итоге. Но вариант введения дополнительного класса, который будет хранить параметры инициализации пока они не понадобятся, мне тоже кажется очень плохим, т.к. при создании нового типа объекта придется делать два класса вместо одного, а это морока.
РМ>Ну а чтобы избежать проблем недоинициализированные объекты хранятся внутри системы инициализации, которая их не отдает наружу пока они не проинициализируются.
я лично вообще не понимаю зачем обязат иметь недоиниц обьекты
вот мы пишем скайп. у нас есть контакты. есть класс их представления ContactView и контроллер — ContactController

Contact содержит в себе просто инфу о контакте — там, id, имя
struct Contact
{
  id_t id, string nickname;
};

ContactView использует станд компонент нашего гуя - TreeView и слушает инфу об изменении контактов

struct ContactView : public ContactListener
{
  TreeView tree_view;

// ContactListener intervace
  virtual void onload(const Contacts &contacts)
  {
    for (auto &c : contacts)
      tree_view.add_node(ContactItemView(c)); // или просто как вызов on_add()
  }

  virtual void onremove(const Contact &c)
  {
     tree_view.remove(find_tree_node(c));
  }
  .. + on_add + on_change - который может быть реализован для начала просто как on_remove(), on_add()
};

есть ContactController
{
  ContactListener &listener;
  Contacts contacts;
  ContactController(SerializationStuff &s, ContactListener &listener)
  {
    s >> contacts;
    listener.onload(contacts);
  }

  void add(id)
  {
    contacts.push_back(Contact(id));
    listener.onadd(*contacts.rbegin());  
  }
}

где ContactItemView : public TreeItemView
{
  ContactItemView(const Contact &c) : TreeItemView(c.nickname)
  {
     if (birthday(c))
       add_cake();
  }

  add_cake()
  {
    set_image(Image::CAKE)
  }
}

ну и в чем проблема-то? это самый стандартный тупой лобовой способ это сделать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.