Как сделать красиво?
От: Dufrenite Дания  
Дата: 15.09.07 16:03
Оценка:
Требуется сгенерировать оператор десериализации для заданного поля. Пусть сигнатура метода будет следующей:
private сгенерироватьОператор(поле : IField) : PExpr
{
}

Оператор десериализации различен для каждого типа. Например для типа int мы должны получить:
def _поле1 = reader.ReadInt32();

для типа float:
def _поле1 = reader.ReadSingle();

и так далее...
Вопрос: как красиво сделать сопоставление с образцом в методе сгенерироватьОператор()?
На данный момент мне в голову ничего не приходит кроме этого:
private сгенерироватьОператор(поле : IField) : PExpr
{
    def имя = Macros.UseSiteSymbol(поле.Name);
    match (поле.GetMemType().SystemType.FullName)
    {
        | "System.Byte" => <[ def $(имя : name) = reader.ReadByte() ]>;
        | "System.SByte" => <[ def $(имя : name) = reader.ReadSByte() ]>;
        | "System.Int16" => <[ def $(имя : name) = reader.ReadInt16() ]>;
        | "System.UInt16" => <[ def $(имя : name) = reader.ReadUInt16() ]>;
        | "System.Int32" => <[ def $(имя : name) = reader.ReadInt32() ]>;
        | "System.UInt32" => <[ def $(имя : name) = reader.ReadUInt32() ]>;
    }
}

что выглядит совершенно по дилетантски...
Re: Как сделать красиво?
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.09.07 12:13
Оценка:
Здравствуйте, Dufrenite, Вы писали:

D>Вопрос: как красиво сделать сопоставление с образцом в методе сгенерироватьОператор()?

D>На данный момент мне в голову ничего не приходит кроме этого:...

Если набор типов ограничен и все они системные, то можно и так как делаешь ты.

Если набор типов расширяем и/или в него могут входить типы объявленные в текущем проекте, то лучше сделать как-то по другому. Например, можно завести хэш-таблицу в которой ключем будет тип (если не ошибаюсь MType), а значением цитата кода десериализующего этот тип. Тогда ты сможешь пополнять этот список соответствия динамически.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как сделать красиво?
От: _pk_sly  
Дата: 19.09.07 14:35
Оценка:
лучше, конечно, сделать однозначное преобразование
например, точки в названии типа заменить на подчёркивание и добавить префикс ("Read_" или какой там надо)
получится, например, Read_System_Byte()
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.