Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
Система логического вывода с одной входной переменной
В статье рассматривается система логического вывода с одной входной переменной. Приводятся теоретические сведения, алгоритмы, а также исходный код программы решающей данную задачу.
Система логического вывода. Некоторые определения
Нечеткой системой логического вывода с одной входной переменной называется совокупность из правил Ri, входной переменной A’ и выхода B’. Правила имеют вид:
где Ai и Bi — это нечеткие множества из терм-множеств переменных x и y.
Выражение «x есть Ai» называют предпосылкой, а выражение «y есть Bi» называют следствием.
Вычисление выхода B’ возможно тремя способами с помощью, так называемых, правил. Рассмотрим эти правила логического вывода.
Первое правило логического вывода
Описание логики работы приложения и разработка программного обеспечения
В разрабатываемом приложении реализуется демонстрация работы многопоточного приложения на примере последовательного возрастания чисел от 1 до 20.
Алгоритм работы с биолокационным маятником на личном примере
Пользователь имеет возможность запуска потока, приостановки и возобновления потока, а также остановки запущенного потока с сохранением текущего состояния в файл и последующей загрузки и продолжения потока с сохраненного состояния.
В отдельном потоке происходит изменение чисел, путем последовательного возрастания от 1 до 20.
В файл сохраняется значение переменных потока в момент его остановки и сохранения. И извлекаются из него при загрузке сохраненного потока.
В соответствии с необходимыми требованиями для реализации многопоточного приложения был использован компонент TThread.
Приложение состоит из 3-х модулей (unit). Два из которых содержат формы и один(модуль) — поток TMyThread.
Листинг программы приведен в приложении А.
При разработке программного обеспечения были использованы следующие команды и действия:
· Создали поток класса TThread : TMyThread = class(TThread).
· Описали класс TThread: procedure TMyThread.Execute.
· Создали на форме поле Мemo, в котором будет отображаться поток.
· Для реализации запуска, приостановления и возобновления потока, а также остановки, сохранения и загрузки сохраненного потока реализовано следующее меню, состоящее из 5 основных кнопок:
— «Запуск» — запускает поток;
— «Пауза» — «Продолжить» — приостанавливает и возобновляет поток;
— «Остановка» — останавливает и сохраняет поток;
— «Сохранить» — сохраняет поток;
— «Загрузка» — загружает сохраненный поток.
Для того, чтобы пользователь не нажал кнопку в момент, когда она не может выполнить свое действие, кнопки делаются активными лишь когда их действие может быть выполнено без ошибок.
· Добавили модуль SyncObjs, в котором находятся классы для реализации синхронизации.
· Использовали класс Tcriticalsection. Этот класс позволяет нам выполнять только один поток. При использовании нескольких потоков он дает возможность завершиться первому потоку, после чего будет начат второй поток.
Что такое “бизнес логика”? И как начать ее понимать
· Для того, чтобы сохранить данные с поля Мemo мы использовали строку Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + Save.txt’); где ExtractFilePath(Application.ExeName) — это путь к нашему проекту.
· Для удобства также были созданы еще 2 формы, в одной форме идет запрос на сохранение, а в другой — подробная информация о программе.
Описание пользовательского интерфейса
В интерфейсе проекта используются компоненты Delphi: Button, Memo, Label, SpinEdit.
Label — предназначен для отображения статического текста, то есть надписей и меток на Форме, которые не меняются в течение всего времени работы программы.
Memo — используется для ввода больших объёмов текста.
Button — используется для реализации в программе команд с помощью обработчика события OnClick этого компонента.
SpinEdit — представляет собой сочетание Edit и UpDown, оформленное как отдельный тип компонента.
При запуске проекта мы попадаем на следующую форму:
Рис.1. Запуск проекта.
Далее при нажатии на кнопку «Запуск» происходит запуск потока путем последовательного возрастания чисел от 1 до 20.
Рис.2. Запуск потока.
Запущенный поток можно приостановить, нажав на кнопку «Пауза», после чего кнопка «Пауза» меняется на кнопку «Продолжить», при нажатии на которую поток возобновляется.
Рис.3. Приостановка потока.
Рис.4. Возобновление потока.
Запущенный поток можно остановить и сохранить, нажав на кнопку «Остановка», после чего появляется окно о сохранении потока. При нажатии на кнопку «Да» поток сохраняется. Можно отказаться от сохранения потока, нажав на кнопку «Нет». Впоследствии остановленный поток возможно сохранить при нажатии на кнопку «Сохранить».
Рис.5. Остановка и сохранение потока.
Сохраненный поток возможно загрузить с состояния, с которого он был остановлен, и продолжить, нажав на кнопки «Загрузить» и «Запуск».
Рис.6. Загрузка сохраненного потока.
Рис.7. Продолжение потока с сохраненного состояния.
Так же в проекте есть дополнительная форма для вывода информация о проекте.
Рис.8. О программе.
Источник: studentopedia.ru
Отделение логики, отображения и данных
05 Июня 2009 Программирование 26
0
Несколько лет назад я читал книгу «Совершенный код» и выразил свое несогласие с автором, когда он говорил, что нужно писать не на языке, а с использованием языка. Как пример автор приводил утверждение, что если в языке нет объектов, то их нужно изобрести и написать. Это слишком радикальный метод, который я не могу поддержать. В данном случае проще и эффективнее будет поменять язык на объектный. Такие языки, как Delphi и Java слишком разные, чтобы писать на них одинаково, потому что у языков слишком разная идеология.
В последнее время я начинаю думать, что лучше бы все послушали Макконелла и всегда программировали с использованием языка, особенно программисты Delphi и С#. Почему? Потому что это визуальные языки и в них среды разработки очень мощные и балуют программиста простотой. Достаточно кликнуть мышкой, чтобы создать обработчик события и написать в нем код логики. Для очень и очень маленьких приложений это терпимо, а вот для больших проектов — это зло.
Существует множество подходов к программированию, но мне кажется, что лучший вариант — это отделение логики, данных и представления. Такие походы, как MVC придуманы уже давно и до сих пор успешно используются во многих компаниях. Только используются далеко не всеми. Я практически не видел подходы с разделением в проектах на Delphi и это ужасно. Народ почему-то пишет логику прямо в модулях представления или перепрыгивает сразу на трехуровневое программирование, когда код логики (тут любят применять красивое выражение «бизнес логика») выносится на промежуточный уровень.
Чем плох подход, когда логика находится прямо в модулях представления? Это идеальное бревно из дуба, у которого напрочь отсутствует гибкость. На последней работе за долгие годы существования компании было написано очень много кода с использованием устаревших технологий. Один только BDE чего стоит. Его уже давно используют, но при этом понимают, что вечно так продолжается не может.
Так как логика доступа к базе данных внедрена непосредственно в модули представления (форм), то переход на другую технологию доступа к базам данных превращается в ад. Нужно перекалбасить все модули громадного количества проектов, созданных за долгие годы. Поэтому в компании особо не торопятся переходить на что-то новое и застряли в прошлом веке.
Переход на новые технологии обойдется компании громадными затратами ресурсов, а ведь нужно двигаться дальше. Невозможно просто остановить текущую разработку и заниматься переписыванием старья. За счет того, что в компании, о которой я говорю, работают далеко не тупые программеры (есть студенты, но большинство с большим опытом), они с успехом преодолевают недостатки BDE, но борьба с недостатками не может быть вечной.
Чужие модули и проекты я критиковать не буду (я уже много раз говорил, что я не критик, и критиков и без меня полно), я лучше расскажу на примере своего проекта, что и почему я делал. У меня есть один проект, который я выкинул в свободный доступ с открытым кодом — Database Modeller. В нем далеко не все идеально, потому что я создал его давно и на скорую руку на конкурс от компании Sun Microsystems.
Просто однажды зашел на сайт и увидел, что у них мало проектов зарегистрировано на конкурс, а у меня как раз на работе была скука-печаль и я на скорую руку набросал проект, который может быть кто-то доведет до ума :). Хотя прекрасно понимаю, что никто не будет этого делать. Но может хоть источники кому пригодятся.
Короче. Тем кто не в курсе — проект позволяет визуально строить простую модель базы данных и применять созданную модель на базу. Программа также позволяет построить модель по текущей базе.
Программа должна работать с базами и всю логику работы с базой нужно выносить в отдельный класс, а точнее группу классов, которую назовем дружком. В классах, стоящих визуальный интерфейс, пишем только код визуального интерфейса, который может использовать движок для выполнения логики.
Существуют разные базы данных и в каждой из них могут быть разные реализации различных команд и операторов. Это выборка данных (SELECT) почти одинаков везде, а создание базы может отличается. Чтобы написать универсальный двиг, я создал базовый класс с именем DBInterface, в котором описаны все необходимые движку функции. Те функции, которые общие для всех баз данных, можно реализовать прямо в базовом классе.
Теперь, создаем наследника от этого базового класса DBInterface с именем DBInterfaceOracle, который реализует абстрактные функции с учетом базы данных Oracle. Таким образом, моя программа научится работать с этой БД. Можно создать еще одного наследника и реализовать необходимые функции с учетом любой другой базы данных. Таким образом, программа Database Modeller, сможет работать с любыми базами. Я сейчас точно не помню, но я кажется реализовал для примера работу с Oracle и MySQL.
Функции обращения к базе желательно было описать только в базовом классе, а в наследниках только использовать эти функции. В этом случае, если на рынке появится что-то более крутое для доступа к БД, достаточно будет переписать только один класс.
Благодаря такому разрешению, я могу изменять движок программы, не изменяя визуального представления, а так же изменять представление, не трогая движка. Работать с кодом удобно и непринужденно.
Точно так же построены программы CyD Careful Observer — Сетевой Монитор и Сетевые утилиты и безопасность, правда их исходные коды я показать не могу :). Поверьте мне на слово, в этих проектах код написан более аккуратно и логика напрочь отделена от представления. С большим распространением .NET 3.0 и 3.5, визуальный интерфейс будет переписан на WPF, при этом двиг программы переписывать не нужно будет.
Не знаю почему, но когда я писал на Delphi, то меня тянуло писать логику прямо в модулях визуального интерфейса. Когда я пишу на С# или Java, то меня тянет к отделению представления от логики. Мне сами языки нравятся и от программирования на С# в Visual Studio я получаю больше удовольствия.
Если ты знаком с Java, то советую посмотреть исходные коды этого о проекта. Он не идеален, но может быть, ты что-то найдешь для себя интересное в реализации. Напоминаю, проект создан на быструю руку.
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Источник: www.flenov.info