Твердые Принципы / Модель Строителя - PullRequest
0 голосов
/ 11 ноября 2018

Я создаю очень маленькое приложение для демонстрации надежных принципов, а также краткую реализацию шаблона построения. Есть ли у кого-нибудь отзывы о том, как это можно улучшить или как оно нарушает надежные принципы? Приложение представляет собой небольшое приложение, которое просто конвертирует единицы, например, ярды в метры, дюймы в смс.

Интерфейс

public interface IConverter
{
    double ConversionRate { get; set; }
    string[] ConvertedUnits { get; set; }
    string DisplayText { get; set; }

    string[] Convert(string input);
}

Интерфейс реализации класса

 public class Converter : IConverter
    {
        public double ConversionRate { get; set; }
        public string[] ConvertedUnits { get; set; }
        public string DisplayText { get; set; }

        public Converter(double conversionRate, string[] convertedUnits, string displayText)
        {
            ConversionRate = conversionRate;
            ConvertedUnits = convertedUnits;
            DisplayText = displayText;
        }

        public string[] Convert(string input)
        {
            if (!input.Contains('\n'))
            {
                double d = double.Parse(input, CultureInfo.InvariantCulture) * ConversionRate;

                string[] array = new string[1];
                array[0] = d.ToString();

                return array;
            }
            else
            {
                double[] doubles = new double[input.Split('\n').Count()];

                for (int i = 0; i < input.Split('\n').Count(); i++)
                {
                    double value = double.Parse(input.Split('\n')[i]);
                    doubles[i] = value;

                    string.Format("{0}", value * ConversionRate);
                }

                string[] strings = new string[doubles.Length];

                for (int i = 0; i < input.Split('\n').Length; i++)
                {
                    strings[i] = string.Format("{0}", doubles[i] * ConversionRate);
                }

                return strings;
            }
        }
    }

Строитель (абстрактный класс)

public abstract class ConverterBuilder
    {
        protected double _conversionRate;
        protected string[] _convertedUnits;
        protected string _displayText;

        public ConverterBuilder AddConversionRate(double conversionRate)
        {
            _conversionRate = conversionRate;
            return this;
        }

        public ConverterBuilder AddConversionRate(string[] convertedUnits)
        {
            _convertedUnits = convertedUnits;
            return this;
        }

        public ConverterBuilder AddDisplayText(string displayText)
        {
            _displayText = displayText;
            return this;
        }

        public Converter Build()
        {
            return new Converter(_conversionRate, _convertedUnits, _displayText);
        }

    }

Конструктор, реализующий абстрактный класс построителя

public class UnitConverterBuilder : ConverterBuilder
{
    public UnitConverterBuilder()
    {

    }
}

Контроллер

public IActionResult Convert(string text, double conversionRate)
{
    Converter converter = new UnitConverterBuilder()
    .AddConversionRate(conversionRate)
    .Build();

    string output = "";
    for (int i = 0; i < converter.Convert(text).Count(); i++)
    {
        output += converter.Convert(text)[i] + Environment.NewLine;
    }

    return Content(output);

}

View

Введите значения для преобразования

<form asp-controller="Home" asp-action="Convert" method="post">
    <textarea id="text" name="text" rows="10" cols="40"></textarea>
    <select name="conversionRate">
        <option value="">Please Select</option>
        <option value="0.9144">Yards to Meters</option>
        <option value="2.54">Inches To Centimeters</option>
    </select>
    <button>Convert</button>
</form>

Приложение построено с использованием ядра .net, любая обратная связь с благодарностью:)

1 Ответ

0 голосов
/ 13 ноября 2018

Это не обязательно связано с принципом SOLID, но я бы хотел упомянуть несколько вещей, если бы я проверял этот код на работе

  • Чрезмерное использование char '/n'.Если вы хотите изменить значение с '/n' на '/r/n', вам придется изменить его 5 раз в Converter.Convert.Лучший способ справиться с этим - сохранить это в переменной или, возможно, разрешить ее установку с помощью конструктора.
  • Вы можете использовать var вместо явного указания типа переменной, например var d = double.Parse(input, CultureInfo.InvariantCulture) * ConversionRate;
  • Имена переменных, чистый код должен быть легко читаемым, поэтому вместо использования таких имен, как d и двойные, используйте имена, которые легко понять при чтении кода
  • Вам не нужно указывать свойстваПреобразователь на интерфейсе IConverter, это потому, что интерфейсу нужно только раскрыть поведение объекта, а свойства - это больше детали реализации.Удаление свойств позволит вам иметь несколько объектов, которые реализуют IConvert, без необходимости иметь эти конкретные свойства (разделение интерфейса)

Надеюсь, это помогло:)

...