Реализация шаблона Builder на C#? Верна ли моя реализация?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Реализация шаблона Builder на C#? Верна ли моя реализация?

Сообщение Anonymous »

Я реализовал создание результатов конвертации валюты с помощью шаблона построителя на C#. Ниже приведен мой исходный код без шаблона компоновщика:

Код: Выделить всё

var verboseResult = new VerboseCurrencyConversionResult
{
Date = date,
Currency = fromCurrency,
Denominator = toCurrency,
Description = $"Currency conversion from {fromCurrency} to {toCurrency}",
};

if (hasFromCurrency && hasToCurrency)
{
verboseResult.Calculated = true;
verboseResult.Source = Source;
verboseResult.Value = Math.Round((double)(partsFromCurrency.Value ?? 0) / (double)(partsToCurrency.Value ?? 1), 4);
verboseResult.Parts = new List
 { partsFromCurrency, partsToCurrency };
}
else
{
verboseResult.Calculated = false;
verboseResult.Source = partsFromCurrency?.Description;
verboseResult.Value = partsFromCurrency?.Value;
verboseResult.Parts = null;
}

if (!verbose)
{
var nonVerboseResult = new BasicCurrencyConversionResult
{
Date = verboseResult.Date,
Currency = verboseResult.Currency,
Denominator = verboseResult.Denominator,
Value = verboseResult.Value
};
return nonVerboseResult;
}

return verboseResult;
Я провел его рефакторинг, используя шаблон построителя. Вот обновленный код с реализацией шаблона компоновщика:

Код: Выделить всё

var resultBuilder = new CurrencyConversionResultBuilder()
.WithDate(date)
.WithCurrency(fromCurrency)
.WithDenominator(toCurrency);

var verboseBuilder = resultBuilder.ToVerbose();

if (hasFromCurrency && hasToCurrency)
{
verboseBuilder
.WithCalculated(true)
.WithSource(Source)
.WithParts(new List { partsFromCurrency, partsToCurrency })
.WithValue(Math.Round((double)(partsFromCurrency.Value ?? 0) / (double)(partsToCurrency.Value ?? 1), 4));
}
else
{
verboseBuilder
.WithCalculated(false)
.WithSource(Source)
.WithParts(null)
.WithValue(partsFromCurrency.Value);
}

if (!verbose)
{
return resultBuilder.WithValue(verboseBuilder.Build().Value).Build();
}

return verboseBuilder.WithExchangeDescription($"Currency conversion from {fromCurrency} to {toCurrency}").Build();
Вот мои классы-строители:

Код: Выделить всё

public class CurrencyConversionResultBuilder
{
private BasicCurrencyConversionResult _result;

public CurrencyConversionResultBuilder()
{
_result = new BasicCurrencyConversionResult();
}

public CurrencyConversionResultBuilder WithDate(string date)
{
_result.Date = date;
return this;
}

public CurrencyConversionResultBuilder WithCurrency(string currency)
{
_result.Currency = currency;
return this;
}

public CurrencyConversionResultBuilder WithDenominator(string denominator)
{
_result.Denominator = denominator;
return this;
}

public virtual CurrencyConversionResultBuilder WithValue(double? value)
{
_result.Value = value;
return this;
}

public BasicCurrencyConversionResult Build() => _result;

public VerboseCurrencyConversionResultBuilder ToVerbose()
{
return new VerboseCurrencyConversionResultBuilder(_result);
}
}

public class VerboseCurrencyConversionResultBuilder : CurrencyConversionResultBuilder
{
private VerboseCurrencyConversionResult _verboseResult;

public VerboseCurrencyConversionResultBuilder(BasicCurrencyConversionResult result)
{
_verboseResult = new VerboseCurrencyConversionResult
{
Date = result.Date,
Currency = result.Currency,
Denominator = result.Denominator,
Value = result.Value
};
}

public VerboseCurrencyConversionResultBuilder WithExchangeDescription(string description)
{
_verboseResult.Description = description;
return this;
}

public VerboseCurrencyConversionResultBuilder WithCalculated(bool calculated)
{
_verboseResult.Calculated = calculated;
return this;
}

public VerboseCurrencyConversionResultBuilder WithSource(string source)
{
_verboseResult.Source = source;
return this;
}

public VerboseCurrencyConversionResultBuilder WithParts(List
 parts)
{
_verboseResult.Parts = parts;
return this;
}

public override CurrencyConversionResultBuilder WithValue(double? value)
{
_verboseResult.Value = value;
return this;
}

public new VerboseCurrencyConversionResult Build() => _verboseResult;
}
Выглядит ли моя реализация шаблона построителя правильно и соответствует ли она лучшим практикам? Есть ли какие-либо улучшения или модификации, которые вы могли бы предложить для улучшения этого шаблона или общей структуры кода?


Подробнее здесь: https://stackoverflow.com/questions/787 ... is-correct
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Не удалось найти http-builder-0.7.2.jar (org.codehaus.groovy.modules.http-builder:http-builder:0.7.2)
    Anonymous » » в форуме Android
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Не удалось найти http-builder-0.7.2.jar (org.codehaus.groovy.modules.http-builder:http-builder:0.7.2)
    Anonymous » » в форуме Android
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Не удалось найти http-builder-0.7.2.jar (org.codehaus.groovy.modules.http-builder:http-builder:0.7.2)
    Anonymous » » в форуме Android
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Не удалось найти http-builder-0.7.2.jar (org.codehaus.grovy.modules.http-builder: http-builder: 0,7,2)
    Гость » » в форуме Android
    0 Ответы
    19 Просмотры
    Последнее сообщение Гость
  • Не удалось найти http-builder-0.7.2.jar (org.codehaus.grovy.modules.http-builder: http-builder: 0,7,2)
    Anonymous » » в форуме Android
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»