Задачи для начинающих
Для начала попробуйте просто описать алгоритм используя конструкции "Делай ..." и "Если ... То... Иначе
наверное перед тем, как что-то программировать, правильно было бы почитать про PID контроллер, хотя бы в википедии. Там и теория есть, и свойства решения, и как это можно имплементировать. Кстати, в arduino под это есть аж целая PID Library.
Знакомый в Уни, начал подкидывать задачки.
а я бы добавил задачки от другого профессора, которые он публикует на bwinf.de - там выбор побольше будет, а если взять второй тур и все предыдущие годы, то на несколько лет можно чадо по самое здрасте загрузить, да и самому порадоваться за красиво поставленные задачи.
Может быть я что-то не так понял (и уж точно я не знаю питон :) ), но мне кажется, что ты пытаешься решить задачу "в лоб" :)
Я понимаю, что задача настолько просто сформулирована, что "в лоб" решить ее гораздо проще ;)
Но все таки мне кажется, что тут нужно сделать 2 класса:
1) Контроллер градуcника
2) Контроллер обогревателя
Контроллер градусника должен посылать сообщения контроллеру обогревателя.
Таким образом логика контроллера обогревателя становится максимально примитивной и, что важно, тестируемой:
public interface ITermometerController { event EventHandler<TemperatureEventArgs> Temperature; } public class TemperatureEventArgs : EventArgs { TemperatureArgs (int value) { Value = value; } public int Value {get; private set; } } public interface IHeaterController { void HeaterOn (); void HeaterOff (); } public class HeaterController : IHeaterController { public HeaterController (ITermometerController termometer) { termometer.Temperature += termometer_Handler; } public void HeaterOn() { ... } public void HeaterOff() { ... } public void termometer_Handler(object sender, TemperatureArgs e) { if (e.Value > highThreshhold) HeaterOff(); else if (e.Value < lowThreshhold) HeaterOn(); } }
Вот и весь код :)
нужно сделать 2 класса
-----
нужно делать 5 классов - градусник, нагреватель, два контроллера и террариум.
типы оборудования - градусники и нагреватели - могут меняться и потому адаптируются контроллерами.
террариум - ну он по задаче есть - должен присутствовать и агрегировать контроллеры.
это и будет решение в лоб.
НО! это не будет решением начинающего...
нужно делать 5 классов - градусник, нагреватель, два контроллера и террариум.
А еще можно сделать по классу на каждый отдельный орган чувств каждого обитателя террариума.
Поставленная в 1-ом посте задача сводится к "написать котроллер обогревателя". Все остальное - вода.
НО! это не будет решением начинающего...
Это направление, в котором начинающий должен двигаться, если он хочет чему-то научиться.
нужно делать 5 классов - градусник, нагреватель, два контроллера и террариум.
В реальности нужен только один класс, который реагирует на событие. Событие - изменение температуры. Событие приходит от термометра, но на самом деле это не важно - удав может по желанию включать и выключать обогреватель, подавая нужное событие, например имитируя градусник. Градусник не должен пренадлежать обогревателю - лёзе куплюнг. Мне нравится решение программиста, хотя я не понимаю этот синтаксис
Поставленная в 1-ом посте задача сводится к "написать котроллер обогревателя"
-----
Тогда вполне годится сааамый первый вариант...
В постановке задачи определены три сущности - террариум, нагреватель и термометр(?, не явно).
террариум, по определению, должен агрегиривать нагреватель и термометр.
изолируем фактические нагреватель и термометр соответствующими контроллерами.
Вот она - 5-ка.
Можно - усложнить (или упростить сопровождение) введя фабрики для двух сущностей, как оно обычно и бывает на практике.
в котором начинающий должен двигаться
-----
Ну должен. У него, правда, пока еще не уложилось Если...То...Иначе.
Там 2 класса, один из которых не имеет функционала.
-----
А должно быть минимум 3.
Пусть два из них - нагреватель и термометр - абстрактные.
При этом нагреватель не должен знать об термометре, а термометр - об нагревателе.
Вообще не должны. Потому как в террариуме они никак напрямую не взаимодействуют.
Террариум, кстати, тоже не должен управлять процессом - его задача - получить инстансы нагревателя и термометра, создать контроллер на базе полученных инстансов и запустить его в работу.
И, кстати, у тебя в решении есть существенная ошибка.
Она заключается в том, что ты принял как данное термин - нагреватель.
В большинстве случаев это будет корректно.
Но не всегда - террариум, по определению, является системой с контролируемой температурой.
Так что вполне может иметь место ситуация когда надо охлаждать - следовательно - надо переделывать контроллер.
Тогда вполне годится сааамый первый вариант...
Не подходит. Там термометр опрашивается в цикле.
В постановке задачи определены три сущности - террариум, нагреватель и термометр(?, не явно).террариум, по определению, должен агрегиривать нагреватель и термометр.
Аквариум, терариум или жилая комната - в данной задаче это не имеет значения. Это просто описательная информация. Также как в задаче "Ученица 1-ого класса деревенской школы построила себе в лесу шалаш и спрятала там 10 монеток. При этом в своей копилке дома у нее было 16 монеток. Сколько всего монеток было у школьницы?" полно описательной информации, которая ничего не дает. Это просто контекст, который не играет никакой роли в решении.
изолируем фактические нагреватель и термометр соответствующими контроллерами.
Именно это я и сделал. При этом код контроллера термометра никого не
интересует, поэтму я ограничился только кодом контроллера нагревателя.
При этом нагреватель не должен знать об термометре, а термометр - об нагревателе.Вообще не должны. Потому как в террариуме они никак напрямую не взаимодействуют.
Ну это уже holly war на тему "толстых" и "тонких" контроллеров :)
В большинстве случаев это будет корректно.
А если прочитать условие задачи, то это будет корректно и для данной задачи :)
Событие приходит от термометра
-----
А кто сказал, что Термометр в состоянии делать нотификацию?
Может или не может - неизвестно - потому термометр и оборачивается в контроллер термометра.
Нагреватель - аналогично.
удав может
-----
Может.
Для корректно имплементированного кода это не должно вызывать переписывания кода.
И вместо удава там может быть какой-нибудь песец или пингвиn...
Не подходит. Там термометр опрашивается в цикле.
-----
Ну и что? Ну опрашивается, ну в цикле. Заявленному требованию - удовлетворяет - значит годится.
Ну это уже holly war на тему "толстых" и "тонких" контроллеров :)
-----
И тем не менее - если делать правильно - значит делать правильно.
А если прочитать условие задачи
-----
Читаем:
нужно поддерживать постоянную заданную температуру
Об том что функции управляют именно нагревателем - это уже твое восприятие того как они поименованы., но из условия задачи именно нагреватель в качестве устройства не следует.
Ну и что? Ну опрашивается, ну в цикле. Заявленному требованию - удовлетворяет - значит годится.
Где я говорил, что это решение не годится? Я сказал, что это решение "в лоб". Ну или если бы писали на ANSI C :)
И тем не менее - если делать правильно - значит делать правильно.
Толстые и тонкие контроллеры - это не вопрос привильно или нет. Спорить тут не имеет смысла.
Об том что функции управляют именно нагревателем - это уже твое восприятие того как они поименованы., но из условия задачи именно нагреватель в качестве устройства не следует.
Это потому что ты прочитал только половину условия:
нужно поддерживать постоянную заданную температуру, для этого есть функции "ВключитьНагрев", "ОтключитьНагрев".
Почему ты проигнорировал то, что после запятой - большой вопрос.
А кто сказал, что Термометр в состоянии делать нотификацию?
Это самое красивие решение. Поскольку реальные приборы не названы и задача учебная, нужно привести красивое теоретическое решение. Контроллер действительно может долбить термометр регулярно, опрашивая температуру и принимая решение после каждого опроса. Но это не красиво.
Более того, а кто сказал, что обогреватель вообще автоматически может реагировать на изменение температуры? И ВДРУГ, решение Программиста полностью функционирует без переписывания, если в качестве эвента выступает дворник, считывающий температуру и инициирующий события.