![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
I wonder how obvious or how stupid or how ubiquitous is the following trick:
Say, I have an enum somewhere outside of my realm:
and my method takes an instance of that enum, and I really do not like switching based on the enum; of course I can have an
(PURPLE STUFF ADDED LATER)
Is not it a poetry? :)
Say, I have an enum somewhere outside of my realm:
enum DataType {
PERSONAL, COMMUNITY, PRISON, ARMY;
};
....
and my method takes an instance of that enum, and I really do not like switching based on the enum; of course I can have an
EnumMap
, but the funny trick is that my strategies are based on this enum type, so I can do just this:
enum Strategy {
PERSONAL {
public void process(Entity entity) {...};
},
COMMUNITY {
public void process(Entity entity) {...};
},
PRISON {
public void process(Entity entity) {...};
},
ARMY {
public void process(Entity entity) {...};
}
abstract public void process(Entity entity);
DEFAULT{
public void process(Entity entity) {...};
};
abstract public void process(Entity entity);
(and so on, add functionality here )
Strategy forDataType(DataType type) {
Strategy candidate = valueOf(type.name());
return candidate == null ? DEFAULT : candidate;
}
};
....
Strategy.forDataType(myType).process(myEntity);
(PURPLE STUFF ADDED LATER)
Is not it a poetry? :)
no subject
Date: 2007-05-26 02:17 pm (UTC)no subject
Date: 2007-05-26 03:15 pm (UTC)no subject
Date: 2007-05-26 06:38 pm (UTC)Проблема-то в следующем. Нам в метод поступает DataType; надо получить соответствующую стратегию. Ну типа factory вызвать. Ну так эта фабрика-то как работает? А вот я и предложил, как фабрика работает.
no subject
Date: 2007-05-26 08:04 pm (UTC)Никаких хаков, никаков поисков перебором, никаких согласований по именам-идентификаторам.
no subject
Date: 2007-05-26 10:03 pm (UTC)no subject
Date: 2007-05-26 10:06 pm (UTC)no subject
Date: 2007-05-26 05:31 pm (UTC)enum DataType { PERSONAL, COMMUNITY, PRISON, ARMY };
enum Strategy { PERSONAL, COMMUNITY, PRISON, ARMY };
Strategy ForDataType(DataType type)
{
return (Strategy)type;
}
I know it's a dirty hack but it works.
no subject
Date: 2007-05-26 05:48 pm (UTC)И как же в С# работает вот это место:
(Strategy)type
По порядковому номеру элемента? По имени? Этот кастинг описан в спецификациях языка?
no subject
Date: 2007-05-26 06:12 pm (UTC)Запись enum EnumName {...} на самом деле enum EnumName: int {..}. Соответственно, оба enum производные от Int32. Значения нумеруются с 0 и... В общем, дальнейшее понятно.
Хотя я тут подумал... Не совсем я правильно каст написал. Надо бы (Strategy)(int)type писать... Не, проверил - работает.
no subject
Date: 2007-05-26 08:09 pm (UTC)Насколько я помню Delphi, там такой кастинг только через приведение к integer работал (во всяком случае, в ранних версиях), и я злился, почему нельзя напрямую, там-то ведь точно число. :)
Но в Java элемент enum - это полноценный объект, а порядковый номер - лишь одно из его полей.
no subject
Date: 2007-05-27 06:58 am (UTC)2. .Net-овский System.Enum - также полноценный объект (корректнее - value type, т. е. объекты создаются на стеке и от enum нельзя создавать производные типы), с кучей методов, реализующий кучу интерфейсов и т.п.
no subject
Date: 2007-05-27 10:53 am (UTC)Зачем потребовалось вводить такой кастинг непосредственно в язык?
Ведь это значит, что, поменяв последовательность элементов в декларации enum, программист рискует получить проблему при приведении типов, в то время как обычно эта операция либо завершается успешно и делает именно то, что ожидали, либо возбуждает runtime exception.
no subject
Date: 2007-05-28 04:13 pm (UTC)Вообще говоря, перечисления - настолько низкоуровневая штука, что в прикладной программе их быть не должно. Полиморфизм-то не зря придумывали.
no subject
Date: 2007-05-26 06:39 pm (UTC)no subject
Date: 2007-05-26 11:33 pm (UTC)no subject
Date: 2007-05-27 07:06 am (UTC)Вся прелесть .Net-овских перечислений в том, что они ссылочные, т.е. очень дешевые с точки зрения памяти и GC. Методов не накидаешь, правда, зато вышеописанный трюк, что в .Net, что в старой Жаве, что без enum-ов, легко реализуется (и именно так, как вы написали), описан у Бека, и называется pluggable selector.
no subject
Date: 2007-05-28 05:07 am (UTC)no subject
Date: 2007-05-28 04:09 pm (UTC)