Как разбить программу на классы

Цель состоит в том, чтобы иметь простой веб-браузер Java, построенный из компонентов swing, и иметь JEditorPane, хранящуюся в одном классе, а также адресную строку и JButtons для добавления в другой класс. Как заставить их взаимодействовать друг с другом, как они это делали, когда все было в одном классе? Оригинальный класс:

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JavaBrowser extends JFrame < private JTextField addressBar; private JEditorPane contentDisplay; public JavaBrowser() < super(«Java Browser v1.0»); addressBar = new JTextField(«Enter URL here, then press enter»); addressBar.addActionListener( new ActionListener() < public void actionPerformed(ActionEvent event) < loadContent(event.getActionCommand()); >> ); add(addressBar, BorderLayout.NORTH); contentDisplay = new JEditorPane(); contentDisplay.setEditable(false); contentDisplay.addHyperlinkListener( new HyperlinkListener() < public void hyperlinkUpdate(HyperlinkEvent event) < if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED) < loadContent(event.getURL().toString()); >> > ); add(new JScrollPane(contentDisplay), BorderLayout.CENTER); setSize(500, 300); setVisible(true); > public void loadContent(String userInput) < try < contentDisplay.setPage(userInput); addressBar.setText(userInput); >catch (Exception e) < System.out.println(«Invalid URL entered in the address bar!»); >> >
Класс JEditorPane:

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class JavaBrowser extends JFrame < private JEditorPane contentDisplay; public JavaBrowser() < super(«Java Browser v1.0»); contentDisplay = new JEditorPane(); contentDisplay.setEditable(false); contentDisplay.addHyperlinkListener( new HyperlinkListener() < public void hyperlinkUpdate(HyperlinkEvent event) < if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED) < loadContent(event.getURL().toString()); >> > ); add(new JScrollPane(contentDisplay), BorderLayout.CENTER); setSize(500, 300); setVisible(true); > public void loadContent(String userInput) < try < contentDisplay.setPage(userInput); ToolBar.getAddressBar().setText(userInput); >catch (Exception e) < System.out.println(«Invalid URL entered in the address bar!»); >> >
Класс ToolBar:

Python с нуля. Урок 10 | Классы и объекты

import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JTextField; public class ToolBar < private static JTextField addressBar; public static JTextField getAddressBar() < return addressBar; >public void setAddressBar(JTextField addressBar) < this.addressBar = addressBar; >public ToolBar() < JavaBrowser jb = new JavaBrowser(); addressBar = new JTextField(«Enter URL here, then press enter»); addressBar.addActionListener( new ActionListener() < public void actionPerformed(ActionEvent event) < jb.loadContent(event.getActionCommand()); >> ); jb.add(addressBar, BorderLayout.NORTH); > >
William Rose 17 март 2015, в 15:58
Поделиться

Что такое класс. Что такое объект класса. Экземпляр класса это. Класс ООП это. Урок #73

1: создать экземпляр каждого класса View-Controller, который вы представляете, 2: создать ссылки между ними, 3: теперь они могут вызывать функции друг друга.

Warkst 17 март 2015, в 14:57

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

Warkst 17 март 2015, в 14:58

Хорошо, теперь все выглядит хорошо, но моя адресная строка больше не отображается. Все, что я сделал, это добавил «JavaBrowser jb = new JavaBrowser ();» и то же самое для панели инструментов в разных местах. Как я могу это исправить?

William Rose 17 март 2015, в 15:08

Вы создаете новые экземпляры своих объектов друг в друге, но это не так. Вы должны сделать один экземпляр каждого, а затем создать ссылки между ними. Допустим, объект A должен взаимодействовать с объектом B, затем вы добавляете поле в A для хранения экземпляра класса B и вызываете установщик, чтобы он указывал на экземпляр B, который вы создали. Что касается проблем с макетом: создайте JPanel с определенным менеджером макетов (BorderLayout, вероятно, лучше для вас) и добавьте его во фрейм. Добавьте все остальные компоненты в JPanel, а не прямо в рамку.

Warkst 17 март 2015, в 15:14

Краткий ответ — композиция. (что означает создание экземпляра одного класса внутри другого. Затем вы будете управлять этим экземпляром на основе методов внутри этого класса).

Источник: overcoder.net

[ООП] правильное разбитие на классы одного примера

Бывает множество случаев, когда некоторый частный случай более общего типа встречается достаточно часто и реализуется намного проще чем весь тип. Вектор — это матрица с одним столбцом, целое число — это рациональное со знаменателем единица.

Можно много придумать классов с параметрами, у которых бывает простые частные случаи.Причём может быть два варианта — val и var, в первом случае объекты класса immutable и любая операция порождает новый объект, во втором случае объекты класса mutable и некоторые опреации вроде += (для рациональных чисел) могут изменять сам объект.Вопрос простой: какую для задачи рациональных чисел и подобных принято строить струтктуру классов? Может под это дело какой паттерн применим.Вопрос сложнее: я слышал много страшных слов (но понял или изучил далеко не все): метакласс (по определению дельфи case class (по определению скалы ко- и контр- вариации, generic functions, multiple dispatch; правильно ли я понял что все эти слова так или иначе связаны с первоначальным вопросом и используются (не обязательно совместно) для разных вариантов его решения?Сам я размышляю о трёх аспектах вопроса:1. Структура классов, создание объектов, конструкторы и фабрики2. Операции над объектами класса, выведение типа результата, трансформации объектов3. Диспетчеризация функций — определение в каких случаях какой вариант функции использовать (для полного или упрощённого случая).

тоже самое, но с абзацами, которые иначе парсер съедает

>Вопрос простой: какую для задачи рациональных чисел и подобных принято строить струтктуру классов?
если в кратце, то данную задачу никто сознательно не решает.
лишь наивно решаются в каждом случае какие-то частные варианта данной задачи.

да, и самое главное — а зачем это тебе надо?

я знаю только два ответа на вопрос «зачем такое надо»:
1. если делать иначе, то это «некрасиво». т.е. это чисто фундаментальные размышления, требующие большой значительной проработки, но при этом имеющие слабую практическую пользу
2. будет практическая польза на очень больших (масштаба всего инета) централизованных задачах

да, и самое главное — а зачем это тебе надо?

сам я уже решил частным случаем мне кажется что указанная задача должна быть достаточно показательной в плане изучения ООП. У меня есть ощущения, что услышав правильный ответ, я для себя что-то сильно новое в ООП вынесу. Задача плохо ложится на обычную иерархию классов и нужно как-то пристраиваться к ней сбоку (а не сверху вниз). Овладев приёмом такого пристраивания я узнаю методы обхождения некоторых острых углов ООП. Их существование не подлежит сомнению, иначе бы народ не начал городить языков-монстров вроде скалы или библиотеки generic functions (часть PEAK) для питона.

2. будет практическая польза на очень больших (масштаба всего инета) централизованных задачах

3. Бывают примеры посложнее. Для некоторых задач простые параметры позволяют решать задачу в аналитическом виде, а для полного варианта — приходится делать разложение по тейлору и численно решать. Мне так кажется желание максимально долго удерживаться в пределах символьной арифметики вполне понятно

Читайте также:
Как из видео извлечь музыку программа

>указанная задача должна быть достаточно показательной в плане изучения ООП.
указанная задача ортогональна к ООП. сам по себе ООП не имеет ответа как правильно разбивать мир задачи на типы.
к задаче ближе категоризация.
АОП еще настолько же близко, как и ООП.

указанная задача ортогональна к ООП. сам по себе ООП не имеет ответа как правильно разбивать мир задачи на типы.к задаче ближе категоризация. АОП еще настолько же близко, как и ООП.

ну хорошо и так сойдёт. Просто ООП я знаю, остальное нет, и не против проложить мостик

Вот тут по теме, вроде:
http://en.wikipedia.org/wiki/Circle-ellipse_problem
Если все иммутабельное, то проблем особых нет. Если можно менять объект, то шаблоны рвутся инварианты нарушаются, и ООП идет в все плохо.

метакласс (по определению дельфи case class (по определению скалы ко- и контр- вариации, generic functions, multiple dispatch; правильно ли я понял что все эти слова так или иначе связаны с первоначальным вопросом и используются (не обязательно совместно) для разных вариантов его решения?


Скорее нет, чем да.

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

Most descriptions of LSP focus on inheritance, whereas LSP is actually about subtyping, which is more generally about relationships between types and their usage in a particular context. It so happens that inheritance is a mechanism for relating types, and LSP can guide us in that, but it’s not the only game in town. It applies to other forms of polymorphism, such as the classification by Cardelli and Wegner: inclusion polymorphism (extends in Java parametric polymorphism (generics, but nothing so random and clumsy as generics in Java overload polymorphism (particularly relevant when a language supports operator overloading) and coercion polymorphism (in other words, implicit conversions to other types, which is something that you can do in C# and C++, but not Java). In all these cases, LSP applies because it offers guidance on the principle of least astonishment when mixing types that at one level are conceptually interchangeable.

идея классификации полиморфизом мне тоже понравилась. Мне вообще хочется услышать единую теорию всего, которая объяснит, чем разные парадигмы программирования отличаются друг от друга: не в технических частностях (вроде отсутствия goto не в маркетинговых свойствах: стоимость разработки, поддержки и модификации, а именно в устройстве самих парадигм.

http://en.wikipedia.org/wiki/Circle-ellipse_problem

задал эту проблему одному из знакомых физиков. Тот сказал, чтобы не маялся дурью и что оба объекта — это одно и тоже, только для отображения эллипса необходимо ещё оператор проецирования на плоскость задать.

Источник: zavelos.ru

ООП / учебное_пособие

ВВЕДЕНИЕ Одна из важнейших задач программирования – разработка алгоритма. Имеется два основных подхода к разработке программ.

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

Для разработки программ, основанных на использовании объект- но-ориентированного программирования, необходимо: — определить задачу; — определить уникальные объекты в области решаемой задачи; — определить взаимосвязь между объектами; — создать классы объектов, определяя переменные, представляющие всевозможные состояния, в которых может находиться объект; — определить сообщения, принимаемые каждым объектом, и коды функций, согласно которым объект будет реагировать на эти сообщения. Оформить их как функции-члены некоторых классов; — объявить объекты данных классов; — определить начальное состояние системы; — скомпилировать, скомпоновать систему. Цель настоящего учебного пособия помочь в изучении языка С++, поддерживающего объектно-ориентированный подход в программировании. Для успешного освоения излагаемого материала необходимо знание основных конструкций языка С. Материал пособия основывается на ряде изданий [1–11]. 3

1.ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ПОДХОД Объектно-ориентированное программирование – это методология программирования, основанная на представлении программы в виде совокупности взаимодействующих друг с другом объектов, каждый из которых является экземпляром определенного класса, а классы могут образовывать иерархию наследования. Программа будет объектно-ориентированной только при соблюдении трех требований: 1) в качестве базовых элементов используются объекты, а не алгоритмы; 2) каждый объект является экземпляром какого-либо определенного класса; 3) классы организованы иерархически.

Читайте также:
Как писать ооп программы

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

Именно объектно-ориентированная декомпозиция отличает объектноориентированное проектирование от структурного; в первом случае логическая структура системы отражается абстракциями в виде классов и объектов, во втором – алгоритмами. Объектно-ориентированный анализ . На объектную модель повлияла более ранняя модель жизненного цикла программного обеспечения.

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

На результатах анализа формируются модели, на которых основывается проектирование, которое в свою очередь создает фундамент для окончательной реализации системы с использованием методологии программирования. 2. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ 2.1. Абстрактные типы данных Концепция абстрактных типов и абстрактных типов данных является ключевой в программировании.

Абстракция подразумевает разделение и независимое рассмотрение интерфейса и реализации . Интерфейс и внутренняя реализация являются определяющими свой- ствами объектов окружающего нас мира. Интерфейс – это средство взаимодействия с некоторым объектом. Реализация – это внутреннее свойство объекта. 4

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

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

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

Принцип абстракции обязывает использовать механизмы скрытия, которые предотвращают умышленное или случайное изменение внутренней реализации. Различают процедурную абстракцию и абстракцию данных. Процедурная абстракция требует раздельного рассмотрения назначения процедуры (например функции С/С++) и ее реализации.

Абстракция данных требует раздельного рассмотрения операций над данными и реализации этих операций. Достаточно знать, какие операции выполняет модуль (функция С/С++), но не требуется знать, какие данные он при этом использует (они скрыты) и как в действительности выполняются эти операции.

Таким образом, абстракция позволяет отделить внешнее представление модуля от его внутренней структуры. Пользователя не интересует внутренняя структура модуля, а лишь то, что этот модуль может «делать». С точки зрения же разработчика, качество модуля определяется его дешевизной и эффективностью.

Абстракция данных предполагает определение и рассмотрение абстрактных типов данных (АТД), или, иначе, новых типов данных, введенных пользователем. АТД – это совокупность данных вместе с множеством операций, которые можно выполнять над этими данными. 2.2. Базовые принципы объектно-ориентированного программирования Объектно-ориентированное программирование основывается на трех ос- новных концепциях: инкапсуляции , полиморфизме и наследовании . Инкапсуляция (пакетирование) представляет собой механизм, связывающий вместе данные и код, обрабатывающий эти данные, и сохраняющий их от внешнего воздействия и ошибочного использования. Инкапсуляция позво- 5

ляет создавать объект, являющийся логическим целым, включающим данные и код для работы с этими данными. Объект обеспечивает защиту против случайной или несанкционированной модификации частных (private) составляющих его членов. Закрытые данные или коды (методы) доступны только для других частей этого объекта и недоступны вне его.

Открытая часть объекта предназначена для обеспечения контролируемого интерфейса его закрытой части. Полиморфизм обеспечивает возможность реагировать различным образом на одно и то же сообщение (вызов функции-члена). Полиморфизм позволяет уменьшить сложность программы посредством использования одного и того же интерфейса для задания целого класса действий.

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

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

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

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

При построении объектно-ориентированной программы одним из основных является вопрос иерархии классов . Пусть имеется некоторая иерархия (структура, взаимосвязь) классов. В этом случае можно: — определить объект для заданного класса; — построить новый класс, наследуя свойства существующего класса; — изменить поведение нового класса (изменить существующие и добавить новые функции). Построение нового класса, наследованного из существующего, предпола- гает: — добавление в новый класс новых компонент-данных; — добавление в новый класс новых компонент-функций; — замену в новом классе наследуемых из старого класса компонентфункций. Наследование может быть одиночным и множественным (рис. 1). При 6

Читайте также:
Какие программы используют на производстве

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

Общий базовый класс
Производный Производный Производный
базовый класс базовый класс базовый класс
Производный Производный Производный
Простое (одиночное) наследование Множественное наследование
Рис. 1. Виды иерархии классов

Таким образом, объектно-ориентированное программирование – метод построения программ в виде множества взаимодействующих объектов, структура и поведение которых описаны соответствующими классами. Все эти классы образуют иерархию классов, выражающую отношение наследования. При разработке объектно-ориентированных программ часто используются библиотеки классов.

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

Язык программирования называется объектно-ориентированным, если : — он поддерживает абстрактные типы данных (объекты с определенным интерфейсом и скрытым внутренним состоянием); — объекты имеют связанные с ними типы (классы); — поддерживается механизм наследования. Программа будет объектно-ориентированной только при соблюдении всех трех указанных требований.

В частности, программирование, не основанное на иерархических отношениях, не относится к OOП, а называется про- граммированием на основе абстрактных типов данных. 2.3. Основные достоинства языка С++ Язык С++ основывается на языке С, сохраняя большую часть возможностей языка С и расширяя их новыми, ориентированными на реализацию идей ООП.

Язык С++ является мобильным и легко переносимым языком. Получаемый программный код обладает высоким быстродействием и компактными размерами. 7
2.4. Особенности языка С++ Отметим некоторые дополнительные возможности языка С++. Далее в процессе рассмотрения материала мы более подробно остановимся на этих и других, не отмеченных здесь особенностях языка С++.

Необходимо четко представлять, что достоинство языка С++ состоит не в добавлении в С новых типов, операций и т.д., а в возможности поддержки объ- ектно-ориентированного подхода к разработке программ. 2.4.1. Ключевые слова Язык С++ расширяет множество ключевых слов, принятых в языке С,

следующими ключевыми словами:
class new inline try
private delete operator catch
public this template throw
protected friend virtual

2.4.2. Константы и переменные В С++ односимвольные константы (данные, не изменяющие своего значения) имеют тип char, в то же время в С++ поддерживается возможность работы с двухсимвольными константами типа int: ’aB’ , ’nt’ . При этом первый символ располагается в младшем байте, а второй − в старшем. 2.4.3.

Операции В языке С++ введены следующие новые операции: :: − операция разрешения контекста; .* и ->* − операции обращения через указатель к компоненте класса; new и delete − операции динамического выделения и освобождения па- мяти. Использование этих и других операций при разработке программ будет показано далее, при изучении соответствующего материала. 2.4.4.

Типы данных В С++ поддерживаются все типы данных, предопределенные в С. Кроме того, введено несколько новых типов данных: классы и ссылки. Ссылки расширяют и упрощают используемую в С передачу аргументов в функцию: по значению и по адресу. 2.4.5. Передача аргументов функции по умолчанию В С++ поддерживается возможность задания некоторого числа аргументов по умолчанию.

Это означает, что в заголовке функции некоторым параметрам при их описании присваиваются значения. При вызове данной функции 8
число фактических параметров может быть меньше числа формальных параметров. В этом случае принимается умалчиваемое значение соответствующего параметра. Например: #include using mamespace std; int sm(int i1, int i2, int i3=0, int i4=0) < coutint main() < cout > Результатом работы программы будет:

1 2 сумма = 3
1 2 3 сумма = 6
1 2 3 4 сумма = 10

Описание параметров по умолчанию должно находиться в конце списка формальных параметров (в заголовке функции). Задание параметров по умолчанию может быть выполнено только в прототипе функции или при его отсутствии в заголовке функции. 2.5. Простейший ввод и вывод В С++ ввод и вывод данных производится потоками байт.

Поток (последовательность байт) − это логическое устройство, которое выдает и принимает информацию от пользователя и связано с физическими устройствами вводавывода. При операциях ввода байты направляются от устройства в основную память. В операциях вывода – наоборот.

Имеется четыре потока (связанных с ними объекта), обеспечивающих ввод и вывод информации и определенных в заголовочном файле iostream.h: cin − поток стандартного ввода; cout − поток стандартного вывода; cerr − поток стандартной ошибки; clog − буферизируемый поток стандартных ошибок. 2.5.1. Объект cin Для ввода информации с клавиатуры используется объект cin.

Формат записи cin имеет следующий вид: cin [>>имя_переменной]; Объект cin имеет некоторые недостатки. Необходимо, чтобы данные вво- 9
дились в соответствии с форматом переменных, что не всегда может быть гарантировано. 2.5.2. Объект cout Объект cout позволяет выводить информацию на стандартное устройство вывода – экран.

Формат записи cout имеет следующий вид: сout << data [ << data]; data − это переменные, константы, выражения или комбинации всех трех типов. Простейший пример применения cout − это вывод, например, символьной строки: cout << ”объектно-ориентированное программирование ”; cout << ”программирование на С++”.

Надо помнить, что cout не выполняет автоматический переход на новую строку после вывода информации. Для перевода курсора на новую строку надо вставлять символ ’n’ или манипулятор endl. cout << ”объектно-ориентированное программирование n”; cout << ”программирование на С++”<using namespace std;

int main()
< int a=0x11, b=4, // целые числа: шестнадцатеричное и десятичное
c=051, d=8, // восьмеричное и десятичное
i,j;
i=a+b;
j=c+d;
cout << i

cout В результате выполнения программы на экран будет выведена следующая информация: 21 15 25 21 31 31 49 61 10

Источник: studfile.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru