Init/Shutdown - мертвый код?
От: AlexNek  
Дата: 19.04.12 17:26
Оценка:
Сегодня опять немного спорили на работе. Ситуация примерно следующая.
Есть некий интерфейс плагина
public interface IPlugin
{
...
  void Init();
  void Shutdown();
}

В текущей реализации нескольких плагинов Shutdown не делает ничего. Но когда то он точно понадобится.
Init используется только в одном плагине и в дальнейшем вероятно не понадобится.

Первая сторона утверждает, что эти две фукнции мертвый код, который сейчас никому не нужен (вызов Shutdown действительно забыли), Init с первого плагина можно можно перенести в конструктор и удалить эти две фукнции как ненужный код. Когда они действительно понадобятся их можно будет добавить.

Вторая сторона утверждает что лучше сделать забытый вызов Shutdown и оставить пустые функции с комментариями для чего они нужны. Зато когда они действительно понадобятся можно будет без проблем добавить в функции код и все будет работать.

Чъя сторона имеет все же больший вес?
Cообщение написано в << RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227>>
Re: Init/Shutdown - мертвый код?
От: C0s Россия  
Дата: 19.04.12 18:51
Оценка: +2
Здравствуйте, AlexNek, Вы писали:

AN>Чъя сторона имеет все же больший вес?


я обычно при прочих равных голосую за уменьшение энтропии, т.е. в данном случае за первую сторону
Re: Init/Shutdown - мертвый код?
От: rusted Беларусь  
Дата: 19.04.12 20:15
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Зато когда они действительно понадобятся можно будет без проблем добавить в функции код и все будет работать.


Может оказаться, что когда "действительно понадобится", то оно понадобится способом, конфликтующим с тем, что было напроектировано заранее.
Re: Init/Shutdown - мертвый код?
От: Lloyd Россия  
Дата: 19.04.12 20:59
Оценка: 2 (2) +2
Здравствуйте, AlexNek, Вы писали:

AN>Первая сторона утверждает, что эти две фукнции мертвый код, который сейчас никому не нужен (вызов Shutdown действительно забыли), Init с первого плагина можно можно перенести в конструктор и удалить эти две фукнции как ненужный код. Когда они действительно понадобятся их можно будет добавить.


AN>Вторая сторона утверждает что лучше сделать забытый вызов Shutdown и оставить пустые функции с комментариями для чего они нужны. Зато когда они действительно понадобятся можно будет без проблем добавить в функции код и все будет работать.


AN>Чъя сторона имеет все же больший вес?


Третья. Вынесите инициализацию плагина в отдельный интерфейс (IPluginLifecycle?) и пусть хост проверяет, что плагин реализует этот интерфейс и если да, то обрабатывает его специфическим образом.
Re[2]: Init/Shutdown - мертвый код?
От: AlexNek  
Дата: 19.04.12 21:01
Оценка:
Здравствуйте, rusted, Вы писали:

R>Здравствуйте, AlexNek, Вы писали:


AN>>Зато когда они действительно понадобятся можно будет без проблем добавить в функции код и все будет работать.


R>Может оказаться, что когда "действительно понадобится", то оно понадобится способом, конфликтующим с тем, что было напроектировано заранее.

Каким образом? Есть функции "начало" и "конец" фактически это получаются события по котором и можно что то делать.
При этом они там как бы согласно концепта, там пока минимум просто лог ведется. Если их убрать, то потом прийдется как бы придумывать все по новому, и искать куда засунуть вызовы. Иначе можно просто поместить код в известные функции практически ни о чем не думая.
Cообщение написано в << RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227>>
Re[2]: Init/Shutdown - мертвый код?
От: AlexNek  
Дата: 19.04.12 21:09
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Третья. Вынесите инициализацию плагина в отдельный интерфейс (IPluginLifecycle?) и пусть хост проверяет, что плагин реализует этот интерфейс и если да, то обрабатывает его специфическим образом.

В этом направдении как и не думали, пожалуй это будет лучший выход.

Тогда может обсудим проблмы "живой" правки интерфейса? Интерфейс то от плагина, хоть и будет полное обновление, но не хочется иметь проблем. Но и лишнего усложнения также. По крайней мере, номер версии интерфейса в IPlugin имеется.
Нужно ведь будет старый интерфейс менять (удалять функции)
Cообщение написано в << RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227>>
Re[2]: Init/Shutdown - мертвый код?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.04.12 21:22
Оценка: 1 (1) +2
Здравствуйте, Lloyd, Вы писали:

L>Третья. Вынесите инициализацию плагина в отдельный интерфейс (IPluginLifecycle?)


Проблема, судя по стартовому сообщению, не в инициализации, а в Shutdown. И для последнего лучше использовать стандартный IDisposable.
... << RSDN@Home 1.2.0 alpha 5 rev. 31 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[3]: Init/Shutdown - мертвый код?
От: Lloyd Россия  
Дата: 19.04.12 21:26
Оценка:
Здравствуйте, AndrewVK, Вы писали:

L>>Третья. Вынесите инициализацию плагина в отдельный интерфейс (IPluginLifecycle?)


AVK>Проблема, судя по стартовому сообщению, не в инициализации, а в Shutdown. И для последнего лучше использовать стандартный IDisposable.


Имхо, не принципиально. Можно и так, и так.
Re[4]: Init/Shutdown - мертвый код?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.04.12 21:29
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Имхо, не принципиально. Можно и так, и так.


Для IDisposable есть куча полезных хелперов, начиная от using и заканчивая DisposeAll в некоторых библиотеках.
... << RSDN@Home 1.2.0 alpha 5 rev. 31 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[5]: Init/Shutdown - мертвый код?
От: Lloyd Россия  
Дата: 19.04.12 21:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:

L>>Имхо, не принципиально. Можно и так, и так.


AVK>Для IDisposable есть куча полезных хелперов, начиная от using и заканчивая DisposeAll в некоторых библиотеках.


С другой стороны, вариант со своим интерфейсом гибче. Если понадобится передавать в плагин какую-то информацию при "выключении" плагина, то придется придумывать workaround.
Надо смотреть по ситуации, исходя из общих соображений не могу сказать, что лучше, что хуже.
Re[3]: Init/Shutdown - мертвый код?
От: rusted Беларусь  
Дата: 19.04.12 21:42
Оценка: +1
Здравствуйте, AlexNek, Вы писали:

AN>Здравствуйте, rusted, Вы писали:


R>>Здравствуйте, AlexNek, Вы писали:


AN>>>Зато когда они действительно понадобятся можно будет без проблем добавить в функции код и все будет работать.


R>>Может оказаться, что когда "действительно понадобится", то оно понадобится способом, конфликтующим с тем, что было напроектировано заранее.

AN>Каким образом? Есть функции "начало" и "конец" фактически это получаются события по котором и можно что то делать.
AN>При этом они там как бы согласно концепта, там пока минимум просто лог ведется. Если их убрать, то потом прийдется как бы придумывать все по новому, и искать куда засунуть вызовы. Иначе можно просто поместить код в известные функции практически ни о чем не думая.

Сейчас у вас есть два места для инициализации (конструктор и Init) и два места для деинициализации (Shutdown и что там в вашем языке вместо деструктора). Раз оно есть, то со временем начнет использоваться — причем и то и то. А потом могут появится плагины, которым для работы важно наличие других плагинов, и понадобится механизм контроля очередности инициализации/деинициализации. И имеющиеся Init/Shutdown не только не решают эту задачу, но еще и усложняют её.
Re[3]: Init/Shutdown - мертвый код?
От: AlexNek  
Дата: 19.04.12 22:49
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Lloyd, Вы писали:


L>>Третья. Вынесите инициализацию плагина в отдельный интерфейс (IPluginLifecycle?)


AVK>Проблема, судя по стартовому сообщению, не в инициализации, а в Shutdown. И для последнего лучше использовать стандартный IDisposable.

Не подойдет. Плагину можно сделать Shutdown, но не выгружать из памяти. Нужен именно контроллируемый процесс входа/выхода.
Конструктор в общем случае не эквивалентен иниту, а деструктор Shutdown. Хотя в частных случаях это может быть и неважно.
Важно, что инит будет всегда после конструктора, когда объект уже в "устойчивом состоянии".
Cообщение написано в &lt;&lt; RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227&gt;&gt;
Re[4]: Init/Shutdown - мертвый код?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 20.04.12 10:00
Оценка:
Здравствуйте, AlexNek, Вы писали:

AVK>>Проблема, судя по стартовому сообщению, не в инициализации, а в Shutdown. И для последнего лучше использовать стандартный IDisposable.

AN>Не подойдет. Плагину можно сделать Shutdown, но не выгружать из памяти.

И?

AN>Конструктор в общем случае не эквивалентен иниту, а деструктор Shutdown.


А что, кто то предлагал использовать конструктор и деструктор?
... << RSDN@Home 1.2.0 alpha 5 rev. 31 on Windows 7 6.1.7601.65536>>
AVK Blog
Re: Init/Shutdown - мертвый код?
От: jpr111a  
Дата: 20.04.12 20:02
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>В текущей реализации нескольких плагинов Shutdown не делает ничего. Но когда то он точно понадобится.

AN>Init используется только в одном плагине и в дальнейшем вероятно не понадобится.

Как вариант — сделать класс BasicPlugin с пустыми имплементациями методов и пусть плагины наследуются от него
Re[5]: Init/Shutdown - мертвый код?
От: AlexNek  
Дата: 21.04.12 12:41
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, AlexNek, Вы писали:


AVK>>>Проблема, судя по стартовому сообщению, не в инициализации, а в Shutdown. И для последнего лучше использовать стандартный IDisposable.

AN>>Не подойдет. Плагину можно сделать Shutdown, но не выгружать из памяти.

AVK>И?

Ты прав, будет работать, только непонятно для чего городить такой огород.
Да и желательно иметь "симметричные" функции, а не только одну
Cообщение написано в &lt;&lt; RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227&gt;&gt;
Re[2]: Init/Shutdown - мертвый код?
От: AlexNek  
Дата: 21.04.12 12:41
Оценка:
Здравствуйте, jpr111a, Вы писали:

J>Здравствуйте, AlexNek, Вы писали:


AN>>В текущей реализации нескольких плагинов Shutdown не делает ничего. Но когда то он точно понадобится.

AN>>Init используется только в одном плагине и в дальнейшем вероятно не понадобится.

J>Как вариант — сделать класс BasicPlugin с пустыми имплементациями методов и пусть плагины наследуются от него

Вот что значит, зациклится на одном вопросе
Класс то и так есть, только нужно всего то заменить абстракт на виртуал. Это похоже будет хорошим компромиссом.
Cообщение написано в &lt;&lt; RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227&gt;&gt;
Re[6]: Init/Shutdown - мертвый код?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.04.12 12:46
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Ты прав, будет работать, только непонятно для чего городить такой огород.


Какой такой?

AN>Да и желательно иметь "симметричные" функции, а не только одну


У тебя уже есть конструктор. Зачем тебе еще одна функция? Если нужна двухфазная инициализация, то тоже стандартный интерфейс есть, ISupportInitialize.
... << RSDN@Home 1.2.0 alpha 5 rev. 31 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[7]: Init/Shutdown - мертвый код?
От: AlexNek  
Дата: 21.04.12 12:58
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, AlexNek, Вы писали:


AN>>Ты прав, будет работать, только непонятно для чего городить такой огород.


AVK>Какой такой?

сорри ссылку забыл
http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

для второго предложения тот же огород — старт и стоп
http://msdn.microsoft.com/en-us/library/system.componentmodel.isupportinitialize.aspx

У нас тут один "придумал" для каждой функции свой интерфейс делать, что бы потом собирать все что нужно.
Cообщение написано в &lt;&lt; RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227&gt;&gt;
Re[8]: Init/Shutdown - мертвый код?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.04.12 13:02
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>>>Ты прав, будет работать, только непонятно для чего городить такой огород.

AVK>>Какой такой?
AN>сорри ссылку забыл
AN>http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

Да уж, огромный огород — один метод без параметров и возвращаемого значения.

AN>для второго предложения тот же огород — старт и стоп


Понимаешь, если делать двухфазную инициализацию, то разнесение начала и конца инициализации очень полезно. А если нет — я вообще не понимаю зачем тебе вторая инициализация.
... << RSDN@Home 1.2.0 alpha 5 rev. 31 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[9]: Init/Shutdown - мертвый код?
От: AlexNek  
Дата: 21.04.12 13:19
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, AlexNek, Вы писали:


AN>>>>Ты прав, будет работать, только непонятно для чего городить такой огород.

AVK>>>Какой такой?
AN>>сорри ссылку забыл
AN>>http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

AVK>Да уж, огромный огород — один метод без параметров и возвращаемого значения.

Так этот метод уже и так был в примере же рекомендуется делать гораздо больше. И любой кто потм будет разбираться первым делом нарвется на эту ссылку.

AN>>для второго предложения тот же огород — старт и стоп


AVK>Понимаешь, если делать двухфазную инициализацию, то разнесение начала и конца инициализации очень полезно.

В теории — может быть.
AVK>А если нет — я вообще не понимаю зачем тебе вторая инициализация.
Допустим, я хочу глянуть только список доступных плагинов, без их реального использования. А перед использованием нужно сделать немного больше.
Cообщение написано в &lt;&lt; RSDN@Home 1.2.0 alpha 5-AN-R8 rev. 13227&gt;&gt;
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.