Этот вопрос аналогичен (подмножестве) this questionтип использования во время выполнения (в C#) для логики расхода
В этом случае она использует тип во время выполнения, чтобы различать между успехом и провалом вернулись результаты.
Довольно часто я вижу следующую картину:
public struct Result {
public boolean IsSuccess { get;set;}
public string ErrorMessage {get;set;}
public int Value {get;set;}
}
...
Result result = someObject.SomeMethod();
if (result.IsSuccess) DoSomething(result.Value);
else handleError(result.ErrorMessage);
Я думаю, что после более естественно, и выражает намерение более четко (на мой взгляд):
public abstract class Result { }
public sealed class Failure : Result {
public string ErrorMessage { get; set; }
}
public sealed class Success : Result {
public int Value { get; set; }
}
...
Result result = someObject.SomeMethod();
if (result is Success) DoSomething((result as Success).Value);
else if (result is Failure) handleError((result as Failure).ErrorMessage);
Также обратите внимание, что .Net (и многие другие языки) используют этот шаблон в блоке try-catch с несколькими предложениями catch (где тип исключения выбирает блок catch).
EDIT: этот шаблон (т.е. полагаясь на тип среды выполнения) идентичен дискриминированных объединений F #, разница в том, что в F # он является родным, а в C# это эмулируются с использованием конструкций, предназначенных для различных целей.
EDIT: Я думаю, что моя основная проблема с первым кодом - это запах кода «частично инициализированный объект». В 100% случаев будет инициализирована только половина объекта. Он также почти нарушает ISP, «почти», потому что когда-то .IsSuccess оценивается, только часть объекта будет использоваться впредь (если это успех только .Result используется, если это свойство ошибки - только ошибки). Решение для проверки типа запуска не имеет этих проблем.
Вопрос в следующем: В чем проблема с использованием этого шаблона? Меня особенно интересуют вопросы из следующих точек зрения: ремонтопригодность, читаемость, тестируемость, концептуальная чистота и ООП/ООД.
Если вы заботитесь о намерении, никогда не используйте «как» для чего-то, что вы уверены. Если результатом является успех, тогда ((Успех)). Значение – Quibblesome