Рефакторинг серии если-возвращение заявления.


В моей модели, у меня есть вещи, называемые отчеты, которые известны рабочего процесса, связанного с ними.

У меня есть требование, чтобы мощность, с которой в настоящее время государственный отчет.

public abstract partial class Report{
   public virtual string StateStatus(){
     if (Check.IsSuccessful) return "Approved";
     if (Check.AreClarificationsSent) return "Clarifications";
     if (Check.IsInProgress) return "Check in progress";
     if (IsTemplateSent) return "Sent";
     if (IsReceived) return "Received";
     return "Not received";
   }
  ...
}

Мне не нравится этот метод. Он не сломается, но оставляет какую-то тошноту в голове, просто не чувствует себя хорошо.

Есть какие-либо рекомендации по улучшению?



646
2
c#
задан 4 августа 2011 в 01:08 Источник Поделиться
Комментарии
4 ответа

Похоже, что вы хотите, чтобы ваша регистрация в enum, чтобы быть в состоянии предоставить немного больше информации для вас без сложностям если-то беспорядок. Насчет объединения статус строки с счетчиком? Что-то вроде:

public class CheckStatus{
public static readonly CheckStatus
IsSuccessful = new CheckStatus { Value = "Approved" },
AreClarificationsSent = new CheckStatus { Value = "Clarifications" },
IsInProgress = new CheckStatus { Value = "Check in progress" },
IsTemplateSent = new CheckStatus { Value = "Sent" },
IsReceived = new CheckStatus { Value = "Received" },
NotReceived = new CheckStatus { Value = "Not Received" };

private CheckStatus() { }
public string Value{ get; private set; }
}

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

5
ответ дан 4 августа 2011 в 05:08 Источник Поделиться

Я использовал StringEnum, как определено здесь несколько раз, и она работает достаточно хорошо. Он работает так же, как решение IAbstract, но без необходимости выполнять отдельный класс.

Затем, везде, где необходимо ссылаться на StringValue вы можете просто использовать

enum Check 
{
[StringValue("Check in progress")] InProgress,
[StringValue("Not yet received")] NotReceived
}

Check c = Check.InProgress;
string text = StringEnum.GetStringValue(c);

Чтобы избежать обширных переделок можно использовать этот подход.

3
ответ дан 5 августа 2011 в 08:08 Источник Поделиться

Состояние машины. Это прибирает все эти грязные методы в единую собственность, которая сохраняет текущее состояние объекта. Недостатком этого вам нужно привести в порядок другие объекты, тоже...

public partial class Report {

public enum State {
NotReceived = 0,
Received = 1,
TemplateSent = 2,
InProgress = 3,
ClarificationSent = 4,
Successful = 5
}

public State Status { get; protected set; }
}

1
ответ дан 4 августа 2011 в 02:08 Источник Поделиться

Добавить проверить состояние enum и создание чек.Государственная собственность.

Же для отчета.

Тогда ваш метод будет выглядеть как (псевдо):

{
var ret = report.State.ToString();
if (Check.State != CheckState.Unprocessed)
{
ret = Check.State.ToString();
}

return ret;
}

или (некрасиво):

return (Check.State == CheckState.Unprocessed) ? State.ToString() : Check.State.ToString();

1
ответ дан 4 августа 2011 в 04:08 Источник Поделиться