forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Падежирование и костылирование (http://forum.boolean.name/showthread.php?t=19885)

Andvrok 01.07.2015 12:39

Падежирование и костылирование
 
Как вы решаете вопросы падежей? Допустим, у меня есть файлик ресурсов (C#), в котором лежат соответствия значениям энумов:

PHP код:

ENUM_EnDamageType_Physical => Физический урон 

и метод расширения, который эти значения получает:

PHP код:

public static string GetValue(this Enum en)
        {
            
string resourceDisplayName _lov.GetString("ENUM_" en.GetType().Name "_" en);

            return 
string.IsNullOrWhiteSpace(resourceDisplayName) ? string.Format("[[{0}]]"en) : resourceDisplayName;
        } 

Задача: получать нужный падеж при необходимости.

Вопрос: как лучше всего хранить/получать эти значения?

Оговорюсь сразу, про готовые лингвистические библиотеки я в курсе, но они для моей задачи избыточны и несовершенны в своём большинстве, да и вообще, хотелось бы самому повелосипедировать.

На данный момент у меня такое решение: в ресурсах хранится не только номинатив, но и генитив с дативом (остальные не востребованны), разделяемые спец.символом. Например:

PHP код:

ENUM_EnDamageType_Physical => Физический урон|Физического урона|Физическому урону 

В то же время метод допилен до состояния

PHP код:

public static string GetValue(this Enum enEnGrammaticalCase gc EnGrammaticalCase.Nominative)
        {
            
string[] values _lov.GetString("ENUM_" en.GetType().Name "_" en).Split('|');
            switch (
gc)
            {
                case 
EnGrammaticalCase.Genitive:
                    {
                        return 
string.IsNullOrWhiteSpace(values[1]) ? string.Format("[[{0}]]"en) : values[1];
                    }
                case 
EnGrammaticalCase.Dative:
                    {
                        return 
string.IsNullOrWhiteSpace(values[2]) ? string.Format("[[{0}]]"en) : values[2];
                    }
                default:
                    {
                        return 
string.IsNullOrWhiteSpace(values[0]) ? string.Format("[[{0}]]"en) : values[0];
                    }
            }
        } 

Буду рад выслушать более простые/изящные/правильные решения.

Igor 02.07.2015 00:48

Ответ: Падежирование и костылирование
 
Наверно, форматировать строку при каждом вызове метода не очень хорошо, лучше во время инициализации один раз сделать. (хотя, может, ты один только один раз метод для каждого значения вызываешь и смысла нет).
Я бы элементам перечисления EnGrammaticalCase присвоил чиселки 0,1,2, чтобы не писать длинный switch-case




Andvrok 02.07.2015 03:24

Ответ: Падежирование и костылирование
 
Для каждого значения метод вызывается один раз в конструкторе класса и всё; думаю, всё равно стоит сделать только один ретурн, как минимум для удобства.

Длинные значения энумов меня не напрягают, всё равно студия автоподстановкой щедро сыпет.

pax 02.07.2015 09:25

Ответ: Падежирование и костылирование
 
Цитата:

Сообщение от Andvrok (Сообщение 297126)
Длинные значения энумов меня не напрягают, всё равно студия автоподстановкой щедро сыпет.

Igor имел в виду задать соответствие значений энама индексам в массиве:

PHP код:

public static string GetValue(this Enum enEnGrammaticalCase gc EnGrammaticalCase.Nominative

      
string[] values _lov.GetString("ENUM_" en.GetType().Name "_" en).Split('|'); 
      var 
= (int)gc;
      return 
string.IsNullOrWhiteSpace(values[i]) ? string.Format("[[{0}]]"en) : values[i]; 




Часовой пояс GMT +4, время: 00:57.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot