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

StackOverflow https://stackoverflow.com/questions/3472405

  •  28-09-2019
  •  | 
  •  

Вопрос

Я пишу контроллер двигателя, который имеет пару интерфейсов (кнопки, Bluetooth, тактические ручки), которая является задачей, которая неуклонно растет, чтобы быть больше, чем я. Я пытался просто пойти на него, начиная с низкоуровневых модулей (например, код записи, чтобы разговаривать на шине I2C), то выше, что (код, чтобы поговорить с конкретное устройство На автобусе I2C ...), но слишком часто я должен погрузиться назад к моим нижним модулям, чтобы справиться с причудами, которые я не приспособился. Это либо занимает много времени, либо я получаю действительно код Hack-Ish.

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

Я пытался составлять некоторые общие диаграммы и из них для определенных уровней / драйверов, но я не уверен, как их структурировать, поэтому я могу быть очень систематическим об этом и избежать отсутствия нечетного сигнала, который должен идти до 2-3 слои.

Я думаю, что это причина для степени CS? Я инженер-электрик: P

Это было полезно?

Решение

Похоже, вы находитесь на правильном пути. Иногда никакие планирования не собираются предотвратить вас перепроектировать или реформировать части системы позже. Попробуйте некоторые из следующих советов:

  • Держите свой код в модулях, разделенных логическими функциями.
  • Не дублируйте код, вместо этого дизайн многоразовых методов для общей функциональности.
  • Старайтесь избегать искушения, чтобы добавить взлома для особых случаев. В конце концов это станет неодавленным. Вместо этого отрегулируйте и решайте небольшие разделы как можно скорее. Попытка сделать большой повторный дизайн в конце, будет сложнее.
  • Не пытайтесь перевернуть систему с самого начала, так как вы просто потратите время, когда вы дойдете до фактической реализации.
  • Держите нижние уровни максимально простыми, затем создайте более продвинутые возможности сверху.
  • Документе свои функции и напишите некоторые модульные тесты, особенно после добавления сложных условных операторов.
  • Попробуйте поймать ошибки как можно более высоким стеком. Например, выполнение проверки ввода и проверки возвратных значений. Это облегчает отладку.

Другие советы

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

Вот несколько предложений:

  • Обратите внимание на все остальные уровни, чем тот, на которых вы работаете, как будто они запечатаны. Создан другой компанией, разработчиком и т. Д. Устоять на желании изменить другой уровень, чтобы решить проблему в вашем текущем уровне.
  • Создайте «Сияющий уровень» к тому, на котором вы работаете. Это трудно описать в абстрактном смысле, но позволяет сказать, что ваш нижний уровень - это бизнес-слой, а более высокий уровень - это пользовательский интерфейс, создайте другой слой UI для другого приложения. Теперь, имея два потребителя того же API, могут помочь указать, что должно быть в каждом слое.
  • Попробуйте чередовать порядок, в котором вы работаете на ярусах. Например, в некоторых приложениях я сначала более полезный для разработки пользовательского интерфейса. В других случаях это имеет смысл чувствовать статус с моделью данных и работать до UI. Но точка зрения, вы «думаете» API по-разному в этих двух сценариях. И посмотрев на многоуровневый код с обоих углов, помогает.
  • Опыт считается. Иногда просто сделать ошибку из чрезмерно связанного кода - единственный способ по-настоящему научиться избегать его. Вместо того, чтобы планировать свое приложение идеальное, планируйте его несовершенным. Этим, я имею в виду, сначала создал быстрый цикл разработки / тестирования / рефакторирования, чтобы вы могли быстро адаптироваться к ошибкам, которые вы не увидите, пока вы не сделали их. Это также область, где «бросильный прототип» пригодится. Сделайте простой черновик, учитесь у него и выбросьте его. Выбросить часть важен. Даже если его удивительно, начните строить еще один с нуля. Вы неизбежны сделайте его лучше (и в моем опыте, более организованном) основано на том, что вы узнали из прототипа.

Это действительно больше опыта, чем ваша степень. Если вы все еще изучаете вещи о том, как управлять оборудованием, то, конечно, ваш код собирается изменить. Я бы не был агонизировать над этим. Однако, поскольку то, что вы действительно делаете, это прототипирование, вы должны быть готовы решить код, как только у вас его работают. Удалите изброс, разделите данные и функциональность и организуйте свои интерфейсы, чтобы оно имеет смысл.

Мой опыт заключается в том, что код драйвера устройств нуждается в сверху вниз и снизу вверх по дизайну / реализации, что я звоню за пределы. Вы знаете, что пользователь захочет сделать, и вы можете написать эти интерфейсы, и вы знаете, что нужно сделать драйвер низкого уровня, и вы пишете это. Если они не встречаются хорошо в середине, переосмыслите свой макет модуля.

Для улучшения, подлежащая вам дизайн и код для рассмотрения людей с большим опытом. Оставьте эго из этого и просто возьмите их на проблему. Вы также можете прочитать книгу о объектно-ориентированном анализе и дизайне (я использовал книги Питера Coad. Я не знаю, кто их писать сейчас). Хороший покажет примеры того, как разделить проблему в объекты с четкими ролями и обязанностями.

Другое произведение, как только вы закончите прототипирование драйверов и знать, как управлять оборудованием, чтобы убедиться, что у вас есть подробные требования. Ничто не поворачивает код больше, чем открывать требования, пока вы пишете. Вы также можете попробовать изучать UML и проектирование с диаграммами перед записью кода. Это не работает для всех. Также обратите внимание, что вам не нужно кодироваться на языке, который поддерживает объектно-ориентированные конструкции для использования OOD.

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

Обычно это происходит, что вы начинаете с грубой идеи о том, что вы хотите, и как это должно быть сделано, а затем перейдите к записи кода. Позже вы обнаружите, что вы не думали, что вы не думали, и у вас есть несколько зивовных отверстий, которые сейчас, потому что вы вложили время в письменном виде кода, сложно исправить, что приводит к ниму впустую время, либо HALKY код.

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

Попытайтесь «запустить дизайн в своей голове», несколько раз, пока вы не будете уверены, что вы считаете наиболее важными деталями, и вы можете сказать (это самая важная часть, потому что вы всегда пропустите вещи или требования, изменится) Что, если вы пропустили то, вы можете настроить модули относительно легкости.

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

Это немного похоже на совет классической шахматной учителя: "сидеть на руках" :-)

Драйверы поддаются подходу слоя.

Ваши водители могут иметь несколько «классов»:

  • Только вход
  • Только вывод
  • и я и О.

У них должен быть стандартизированный интерфейс, например:

GetKnobLevel()
GetNextKeyboardButton

Или другой подход - иметь что-то вроде

syscall(DRIVERNUMBER, command)

Помещение параметров / результатов в указанные регистры.

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

Вот умственная модель, которую я использую:

---
Application
---
OS
---
Driver communicators
---
drivers
---
hardware

Существует плотно определенная, отсутствующая дисперсионная интерфейс между каждым слоем (я продолжаю вообразить слоевый торт с толстой глазурью между слоями ...). ОС может не существовать для вас, конечно.

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

Это немного «чрезмерного» решения, если честно. Но в ситуации, когда ваша сложность становится значительной, легче иметь жесткую машиностроитель, чем ослабить инженению.

Если вы общаетесь между слоями, вы можете использовать глобальную переменную для каждого коммуникационного «канала» и получить доступ к нему в дисциплинированном моде, используя только функции для доступа к нему.

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

Это подход, который я предпочитал в моих встроенных системах, и это хорошо работает для меня.

Также - это проблемное пространство не исследуется традиционными учебными планами компьютерных наук. Это намного меньше прощения, чем в Интернете или современные операционные системы.

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

Также - код - это ремесло. Не думайте, что вы можете сделать идеальное решение с самого начала. Будьте готовы изменить свой код, когда вы изучаете новые вещи. На самом деле - убедитесь, что вы обнимаете изменить его самоуверенно как часть вашей работы.

Не быть слишком Glib, но цитата из Мифический человеческий месяц приходит на голову: «планируй бросить его; Ты все-таки.

Следствие которого является «заставить его работать. Сделать это правильно. Сделай это быстро».

Я полагаю, что это делает меня сторонником выполнения некоторого дизайна, но не парализована. Это не должно быть идеальным в первый раз. Планировать рефактору. Надеюсь, вы будете писать вещи таким образом, чтобы вы не очень бросали много кода, но переставив вещи более приятным образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top