Статьи с частичным разделением свойств, методов. Как избежать дублирования кода? - PullRequest
0 голосов
/ 04 января 2019

У меня есть три класса: InputSocket, InternalSocket, OutputSocket. Все они наследуются от BaseSocket с реализующим ISocket интерфейсом, где у меня есть общий код для всех классов, и эта часть работает нормально, у меня проблема с частично разделяемым кодом.

InputSocket и InternalSocket делится парсингом части с OutputSocket не имеет.

InputSocket и OutputSocket разделяет часть графического интерфейса с InternalSocket не имеет.

Я ищу способ обмена общими частями кода между InputSocket / InternalSocket и InputSocket / OutputSocket. Код с состоит из методов и параметров. Я уже пытался использовать несколько интерфейсов, но это не решило проблему, ну, это сделало его немного более управляемым. Когда я создаю IParsable для парсинга и IExternal для ввода / вывода общей части , тогда мне нужно создать IParsableSocket для InternalSocket IParsableExternalSocket для InputSocket и IExternalSocket для OutputSocket. Это не меняет смысла в том, что мне все еще нужно реализовывать код для каждого случая, что приводит к дублированию кода.

К сожалению, InputSocket не может одновременно наследовать от OutputSocket и InternalSocet в c #.

Есть ли альтернатива для копирования / вставки кода или создания общего класса Socket с кучей логики if и нулей?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

(Вы должны суффикс с базой, а не префикс с базой)

Итак, у вас есть:

public class InputSocket : BaseSocket { }
public class InternalSocket : BaseSocket {}
public class OutputSocket : BaseSocket {}
public abstract class BaseSocket : ISocket { }
public interface ISocket {}

Общие ресурсы InputSocket и InternalSocket При синтаксическом анализе части с OutputSocket не имеют.

public interface IParsingSocket {}

public class InputSocket : BaseSocket, IParsingSocket  { }
public class InternalSocket : BaseSocket, IParsingSocket  {}
public class OutputSocket : BaseSocket {}

InputSocket и OutputSocket разделяет часть графического интерфейса с InternalSocket не имеет.

public interface IParsingSocket {}
public interface IGUISOcket {}

public class InputSocket : BaseSocket, IParsingSocket, IGUISOcket  { }
public class InternalSocket : BaseSocket, IParsingSocket  {}
public class OutputSocket : BaseSocket, IGUISOcket {}

Реализация с использованием методов расширения:

public static class IParsingSocketExtensions
{
  public static void Parse(this IParsingSocket) {}
}

public static class IGUISOcketExtensions
{
  public static void DoGUI(this IGUISOcket) {}
}

Теперь вы можете

var inps = new InputSocket();
var ints = new InternalSocket();
var outs = new OutputSocket();

inps.Parse() // valid
ints.Parse() // valid
outs.Parse() // invalid

inps.DoGUI() // valid
ints.DoGUI() // invalid
outs.DoGUI() // valid
0 голосов
/ 05 января 2019

Я не думаю, что inheritance является правильным решением для вас здесь. В вашем интерфейсе не должно быть методов, которые вы не собираетесь использовать / реализовывать в своем унаследованном классе. Это нарушение принципа разделения интерфейсов

Принцип интерфейса разделения (ISP) гласит, что ни один клиент не должен быть вынужденным зависеть от методов, которые он не использует

В вашем случае это означает, что BaseSocket НЕ должен быть классом Бога, имеющим все "общие" методы. Вместо этого вам потребуется несколько интерфейсов и реализация, которая выполняет одну специфическую операцию, например, Parse и Gui в вашем случае.

Ваши различные классы Socket затем получают Composed этих поведений / операций вместо inhert ing. Это известно как Состав по наследованию

Композиция над наследованием в объектно-ориентированном программировании Принцип, что классы должны достичь полиморфного поведения и кода повторное использование по своему составу, а не наследование от базы или родительский класс. Это часто провозглашаемый принцип ООП, такой как в влиятельные книги Design Patterns.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...