Использование интерфейса, реализуемого структурой, чтобы не зависеть от конкреций, а для зависимости от абстракций (тверC#

Место общения программистов C#
Ответить
Anonymous
 Использование интерфейса, реализуемого структурой, чтобы не зависеть от конкреций, а для зависимости от абстракций (твер

Сообщение Anonymous »

Я пытаюсь следовать солидным принципам в моем новом проекте C# 12/.net 8.
Я начну с примера:
Учитывая две отдельные сборщики сборки и сборка, где Assemblya определяет интерфейс, который он нуждается в реализации для и Assemblyb, обеспечивает нехватку.// In AssemblyA
public interface IFoo{
public int SomeVariable { get; init; }
}

//In AssemblyB
public readonly struct Foo : IFoo
{
private readonly int _SomeVariable;
public int SomeVariable { get => _SomeVariable; init => _SomeVariable = value; }
}

//And then somewhere in AssemblyB is the function
public static IFoo GetFoo(){
return new Foo{SomeVariable = 1};
}
< /code>
Соответствующими принципами в этом примере являются «принцип сегрегации интерфейса» и «Принцип инверсии зависимости». С помощью DIP мы стремимся сделать Assemblya зависит от абстракции, чтобы оставить гибкость обеспечения конкреции для AssemblyB. Это делает так, что AssemblyB может решить, какой конкретный предоставление в каких обстоятельствах также помогает испытать. С помощью интернет -провайдера мы хотим, чтобы наши интерфейсы были столь же небольшими, насколько это необходимо, поэтому Assemblya не приходится иметь дело со всей сложностью Foo (при условии, что Foo намного более сложный, чем в примере).
Таким образом, пример выше, очевидно, будет работать, но приведет к боксу и, следовательно, снижает потенциальные выгоды от использования (Allocation Esliveance/Stack Allocation). Будьте использовать генерики с ограничениями типа: < /p>
public static TFoo GetFoo() where TFoo : struct, IFoo{
return new TFoo{SomeVariable = 1};
}
< /code>
, который, в свою очередь, заставляет сборку знать, если он хочет избежать бокса. Это не удовлетворяет падению, и если Foo более сложный ISP также не удовлетворен. даже невозможно удовлетворить? Если я не принимаю бокс, но тогда я мог бы использовать классы вместо этого. Что такое общее представление об этом? Есть ли что -то, что мне не хватает, что позволило бы погрузить и интернет -провайдеры с помощью структур, а не типы значений бокса? Я не нахожусь ни в месте, где мне абсолютно необходимо использовать структуры, и я не знаю, если использование struct действительно значительно выиграет в моем случае. Рассматривать этот вопрос как чистый концептуальный.


Подробнее здесь: https://stackoverflow.com/questions/776 ... s-but-to-d
Ответить

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

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

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

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

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