Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (Теоретические основы объектно-ориентированного программирования).pdf
Добавлен: 31.03.2023
Просмотров: 392
Скачиваний: 1
СОДЕРЖАНИЕ
1. Теоретические основы объектно-ориентированного программирования
1.1. История объектно-ориентированного программирования
1.2. Характеристики объектно-ориентированных языков программирования
2. Объектно-ориентированное моделирование
2.1. Объектная модель проектирования
2.2. Объектно-ориентированное программирование
2.3. Проектирование и анализ в рамках объектно-ориентированной модели
3. Практические приемы разработки приложения
2. Строка меню (menu bar). Строка меню также размещается в многослойной панели, в том же специальном слое FRAME_CONTENT_LAYER, и занимает небольшое пространство в верхней части окна, в длину равное размеру окна, ширина используемого пространства при этом зависит от самой строки меню и содержащихся в ней элементов. Корневая панель следит за тем, чтобы панель содержимого и строка меню не перекрывались. Если строка меню в контейнере высшего уровня не требуется, корневая панель использует все пространство окна для размещения панели содержимого.
3. Панель содержимого (content pane) – часть корневой панели, служащая для размещения компонентов пользовательского интерфейса программы. Она занимает большую часть пространства многослойной панели (за исключением того места, что занимает строка меню). Чтобы панель содержимого не закрывала добавляемые впоследствии в окно компоненты, многослойная панель размещает ее в специальном очень низком слое с названием. FRAME_CONTENT_LAYER, с номером -30000. Именно в панель содержимого следует добавлять все компоненты вашего пользовательского интерфейса, это основное отличие контейнеров высшего уровня Swing от их аналогов из AWT. Попытка добавить компоненты напрямую в контейнер (JFrame) высшего уровня Swing приведет к ошибке, так что программисту Java следует запомнить важный вызов:
getContentPane().add(Kомпонент);
Панель содержимого – это экземпляр панели JPanel.
4. Прозрачная панель (glass pane). Прозрачная панель используется в приложениях достаточно редко, поэтому по умолчанию корневая панель делает ее невидимой. Данный слой может использоваться для организации автоматизированного тестирования интерфейса приложения, а также для реализации различных анимационных эффектов.
Подробные описания каждого слоя заслуживают отдельного обсуждения, и выходит за рамки данного пособия.
Классы для представления окон. Окно с рамкой JFrame унаследовано от класса JWindow (в рамках данного курса не рассматривается) и представляет собой наиболее часто используемое в приложениях окно. Окна JFrame обладают рамкой (которая позволяет пользователям легко изменять их размер), заголовком с названием приложения (хотя можно оставлять этот заголовок пустым), иногда системным меню (позволяющим проводить манипуляции с этим окном) и кнопками для управления окном (чаще всего для его закрытия и свертывания). Именно класс JFrame применяется в подавляющем большинстве приложений для размещения компонентов пользовательского интерфейса.
Рассмотрим пример исходного кода, демонстрирующий создание окна:
Рис. 9. Исходный код приложения с ГИП
На рис. 10 показан результат работы программы.
Рис. 10. Окно приложения, демонстрирующее базовый функционал JFrame
Программисту доступен еще один класс для создания фрейма верхнего уровня – JDialog. Диалоговые окна довольно часто используются в приложениях для получения информации, не имеющей прямого отношения к основному окну, например, для установки параметров, вывода важной вспомогательной информации, получения дополнительной информации от пользователя.
Диалоговые окна могут быть модальными (modal), они запрещают всем остальным окнам приложения получать информацию от пользователя, пока тот не закончит работу с модальным диалоговым окном. Модальные диалоговые окна полезны в тех ситуациях, когда информация, получаемая от пользователя, коренным образом меняет работу приложения и поэтому до ее получения продолжение работы невозможно. Внешний вид диалоговых окон повторяет окна с рамкой JFrame, но обычно у них меньше элементов управления (чаще всего, имеется только кнопка закрытия окна) и отсутствует системное меню. Как правило, диалоговые окна всегда располагаются поверх основного окна приложения, напоминая о том, что необходимо завершить ввод информации.
Принципы работы с диалоговыми окнами JDialog схожи с основными операциями класса JFrame. При работе с диалоговыми окнами следует помнить, что они бывают модальными и немодальными. Рассмотрим пример (рис. 5.7):
Рис. 11. Исходный код создания диалоговых окон
Таким образом, очевидно, что работа с классами JDialog и JFrame отличается не значительно.
Использование менеджеров расположения. Поддержка менеджеров расположения встроена в базовый класс всех контейнеров java.awt.Container. Задать и получить расположение элементов можно методами setLayout() и getLayout(). В библиотеки существуют стандартные менеджеры расположения (семь различных классов), но если программист хочет расположить компоненты особенным образом, ему необходимо реализовать интерфейс LayoutManager.
Стандартные менеджеры расположения: FlowLayout, GridLay-out, BorderLayout, GridBagLayout, CardLayout, SpringLayout, Box-Layout. Рассмотрим наиболее простые менеджеры.
Полярное расположение BorderLayout позволяет создать простую структуру окна. При этом окно разбивается на четыре полярных области и одну область, заполняющую центр окна (рис. 12).
Рис. 12. Схема расположения областей менеджера BorderLayout
Добавление компонента в контейнер производится методом add() с дополнительным параметром, указывающим на место рас-положения.
1. Значение BorderLayout.NORTH или строка «North» – компонент располагается вдоль верхней (северной) границы окна и растягивается на всю его ширину (панель инструментов).
2. Значение BorderLayout.SOUTH или строка «South» – компонент располагается вдоль нижней (южной) границы и растягивается на всю ширину окна (строка состояния).
3. Значение BorderLayout.WEST или строка «West» – компонент располагается вдоль левой (западной) границы окна и растягивается на всю его высоту, однако при этом учитываются размеры северных и южных компонентов (они имеют приоритет).
4. Значение BorderLayout.EAST или строка «East» – компонент располагается вдоль правой (восточной) границы окна.
5. Значение BorderLayout.CENTER или строка «Center» – компонент помещается в центр окна, занимая максимально возможное пространство.
Пример использования расположения BorderLayout представлен на рис. 13.
Рис. 18. Листинг с использованием менеджера BorderLayout
На представленном фрагменте необходимо обратить внимание на строку 18, в которой получается объект панели содержимого. Именно на этом объекте вызываются методы add() в строках 21–25.
В строке 19 вызов метода setLayout() закомментирован. Этот метод устанавливает конкретный менеджер расположения, и все элементы, добавляемые на панель содержимого, будут расставлены в соответствии с данным менеджером расположения. В данном случае этот метод можно не использовать, так как BorderLayout – это менеджер расположения по умолчанию.
В строках 21–25 используется метод add(), в качестве второго параметра которого передается характер расположения элемента. Расположение можно определить, как строку: «NORTH», «West» и т. д. Но можно использовать предопределенные значения: Border-Layout.NORTH, BorderLayout.WEST. Очевидны преимущества второго подхода.
Результат выполнения программы представлен на рис. 19.
Рис. 19. Приложение с использованием BorderLayout
Последовательное расположение FlowLayout. Менеджер задает последовательное расположение компонентов, «стопкой» (вертикально или горизонтально). Класс FlowLayout имеет три перегруженные версии:
– без параметров (расположение по умолчанию);
– с заданием выравнивания FlowLayout(int align), где перемен-ная align может принимать значения FlowLayout.LEFT,
FlowLayout.RIGHT, FlowLayout.CENTER, FlowLayout.LEADING, или FlowLayout.TRAILING.
– с выравниваем и заданием расстояния между элементами FlowLayout(int align, int hdist, int vdist), где hdist и vdist – расстоя-ние между элементами, помещаемыми в контейнер, по горизонта-ли и вертикали соответственно.
Пример использования FlowLayout показан на рис. 20.
Рис. 20. Расположение элементов с использованием менеджера FlowLayout
На рис. 21 показан результат работы программы. Следует обратить внимание, что элементы располагаются по горизонтали, а элементы, которым не хватило места в горизонтальном ряду, перемещается на следующую строку.
Рис. 21. Приложение с использованием менеджера FlowLayout
Табличное расположение GridLayout. Менеджер расположения разделяет контейнер на ячейки, в которые затем помещаются элементы управления. Все ячейки таблицы имеют одинаковый размер, равный максимальному размеру добавляемого элемента.
Конструкторы менеджера расположения:
– конструктор без параметров GridLayout() – устанавливает один столбец и одну строку;
– конструктор GridLayout(int rows, int cols) с указанием коли-чества строк (rows) и количества столбцов (cols);
– конструктор GridLayout(int rows, int cols, int hdist, int vdist) – за-дает количество строк (rows) и столбцов (cols), а также горизонтальное (hdist) и вертикальное (vdist) расстояния между элементами.
Если вместо rows или cols передано значение 0, то предполагается, что возможно неограниченное количество строк или столбцов. Сетка будет увеличиваться динамически. Все параметры, задаваемые конструкторами можно изменить с помощью методов объекта GridLayout.
Пример использования менеджера показан GridLayout на рис. 22.
Рис. 22. Использование менеджера GridLayout
Результат работы программы представлен на рис. 23.
Рис. 23. Приложение с использованием менеджера GridLayout
Рассмотрение прочих менеджеров расположения выходит за рамки данного пособия. Необходимо отметить, что если программист намерен применить абсолютное позиционирование элементов, то следует использовать вызов setLayout(null).
Блочное расположение BoxLayout. Менеджер расположения, обладающий широкими одновременно возможностями Grid-BagLayout (сложного менеджера с большим количеством настроек) и BorderLayout (простого менеджера, возможности которого были рассмотрены ранее). Это относительно новый компонент (пакет javax.swing), который рекомендуется использовать для размещения компонентов в современных приложениях. Конструктору класса BoxLayout необходимо указать контейнер, в котором он будет применен, и характер расположения элементов (Y_AXIS – по вертикали; X_AXIS – по горизонтали). Пример использования Box-Layout представлен на рис. 24.
Рис. 24. Использование менеджера BoxLayout
В данном листинге видно, что конструктор BoxLayout отличается от конструкторов менеджеров расположения, рассмотренных ранее. Конструктору в качестве параметра передается контейнер, в котором будет применен данный менеджер.
В результате работы программы создаются две формы с различным расположением элементов (рис. 25).
Рис. 25. Приложение с использованием менеджера BoxLayout
При создании промышленных приложений менеджеры обычно комбинируют и вкладывают друг в друга.
Существую более сложные контейнеры компоновки с широкими возможностями настройки расположения элементов, рассмотрение подобных контейнеров выходит за рамки данного пособия.
ЗАКЛЮЧЕНИЕ
Развитие информационных технологий не только затрагивает аппаратные системы – происходит интенсивное развитие программных систем. Объектно-ориентированные технологии также быстро развиваются. Новые возможности, доступные в языках программирования Java и C#, увеличивают разницу между «новыми» языками программирования и «традиционными» языками ОП (C++). Появление таких инструментов, как делегаты, лямбда-выражения, объектно-реляционное отображение, распределенные объектные системы, развитые модели событий стимулировало бурное развитие новых паттернов проектирования и реинжиниринг существующих.
В сложном мире ОП необходимо хорошо ориентироваться. Для этого необходимо понимать принципы разработки приложений, такие как S.O.L.I.D. Современному программисту необходимо обладать обширными теоретическими знаниями в области паттернов проектирования, без которых невозможна разработка сложных коммерческих приложений.
Разработка графических приложений и веб-приложений представляет собой пример наиболее сложных областей. При проектировании, реализации, тестировании, отладке и сопровождении подобных объектных систем программист должен задействовать максимальный объем доступного инструментария: модульное тестирование, рефакторинг, методы разработки посредством тестирования и, конечно, большинство паттернов и принципов S.O.L.I.D.
Каждая технология, предназначенная для построения развитого графического интерфейса пользователя, представляет собой синергетическое единство различных паттернов: поведенческих, структурных и порождающих.