VB.NET Вопрос дизайна для начинающих - PullRequest
1 голос
/ 21 января 2011

VB.NET, VS 2010, .NET 4

Здравствуйте,

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

Справочная информация. Мое приложение - это управляющая программа для промышленного оборудования.Он анализирует рецепт (из файла Excel), который содержит информацию о времени и уставки для различных подключенных устройств.Существует три основных типа устройств: большинство из них подключаются через терминалы Beckhoff и обмениваются данными через TwinCAT (программное обеспечение Beckhoff's pseudo-PLC), а два являются устройствами RS-232, каждое из которых имеет свой протокол связи.Я могу общаться с устройствами Beckhoff через .NET API, предоставленный Beckhoff.Я написал классы анализатора для двух устройств RS-232.Некоторые из устройств Beckhoff являются входами, некоторые являются выходами;некоторые являются цифровыми, некоторые (псевдо) аналоговыми.

Я думаю, что моя проблема в том, что я пытался обернуть голову вокруг ООП при написании приложения, поэтому я создавал классы волей-неволей, не имея четкого представления об ихиерархия.В некоторых моментах я пытался сделать то, что считал правильным, скажем, создав класс «Device», унаследованный, скажем, классом «TwinCatDevice» и классом «Rs232Device».Но затем я просто вставил весь код связи в эти классы.

Сейчас я пытаюсь создать несколько модулей связи (например, UtilTwinCat, UtilRs232), которые содержат абстрактные методы, такие как «Connect», «Disconnect»., «Чтение», «Запись» и т. Д. Затем я пытаюсь переписать свой класс и подклассы «Устройство», чтобы использовать эти модули, чтобы они не содержали какой-либо (иногда избыточный) код связи.

Вот мой вопрос: было бы неплохо создать отдельные классы для каждого типа связи?т. е. должен ли я иметь, скажем, «TwinCatReadOnlyDigital», «TwinCatReadOnlyAnalog», «TwinCatWriteOnlyDigital», «TwinCatWriteOnlyAnalog», «TwinCatReadWriteDigital», «TwinCatReadWriteAnAnalog», «etc2DigDigital»Или, может быть, некоторые интерфейсы, такие как IReadOnly, IWriteOnly, IDuplex?

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

Заранее большое спасибо, Брайан

Редактировать: IЯ просто хотел добавить, чтобы было ясно, что существует конечное число устройств, параметры которых известны, поэтому было бы просто написать классы для всех типов, которые мне нужны.Мне просто интересно, есть ли лучший подход.

1 Ответ

1 голос
/ 21 января 2011

Этого не достаточно для конкретных ответов, но позвольте мне сделать несколько предложений.

«Я все еще пытаюсь понять, зачем использовать интерфейс».

Главным образом потому, что тогда вы можете «программировать на интерфейс», то есть вам не нужно заботиться о том, работаете ли вы с Beckhoff или устройством RS-232 - вам нужно только то, что вы можете отправлять на него данные. Просто чтобы прояснить: интерфейсы не содержат реализации. Классы, реализующие интерфейс, обещают предоставить конкретные реализации для функций интерфейса.

  • Вместо IReadOnly IWriteOnly и IDuplex используют два интерфейса: IWriteable и IReadable (или любые имена, которые имеют смысл). Дуплексные классы будут реализовывать оба интерфейса.
  • Стратегия или, более вероятно, Шаблонный метод шаблоны могут помочь вам с немного разными классами. Может быть, даже простое создание подклассов, но имейте в виду, что часто существует более простое и приятное решение.
  • Не повторяйте себя (СУХОЙ): попытайтесь найти одно и только одно место для каждого кусочка логики.
  • Функциональность, совместно используемая несколькими классами, должна находиться в суперклассе или служебных классах.

Кроме того, более конкретные вопросы приведут к более конкретным ответам:)

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