2015-08-20 1 views
1

Это может показаться странным вопросом, но я пытаюсь практиковать написание кода многократного использования или, по крайней мере, пытаюсь правильно обдумать это, если вы понимаете, что я имею в виду? У меня есть задание, связанное с написанием текстового интерфейса с несколькими различными меню. Таким образом, есть два подхода к этому: (1) класс для каждого меню (sloppy) или (2) класс, который содержит информацию для всех меню (не как неаккуратно).Java, объекты класса, которые имеют разные методы друг к другу?

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

В качестве альтернативы, если это невозможно/целесообразно, что было бы предпочтительным способом сделать что-то подобное: (a) отдельные классы для отдельных меню или (b) один большой класс, который содержит весь код для разные меню?

+1

Я не в полной мере понять, что вы говорите, но только '" а класс для каждого меню (неаккуратный) или класс, который содержит информацию для всех меню (не как неаккуратный). «бит, на самом деле, разделение в разных классах лучше, когда это возможно (пока это не ставит под угрозу смысл). Взгляните на принцип [SRP] (https://en.wikipedia.org/wiki/Single_responsibility_principle), то, что я говорю, может иметь больше смысла после этого. – acdcjunior

+0

"класс для каждого меню (sloppy) или класс, который содержит информацию для всех меню (не так небрежно)." Если вы пытаетесь использовать многоразовый код, мне интересно, как многократно использовать код, если у вас есть все в одном классе? Я бы сказал, держать вещи раздельно в небольшие управляемые и тестируемые классы. –

+0

К сожалению, у меня нет кода (все еще планирую, как я подойду к этому заданию), я знаю, что его трудно понять. @acdcjunior Обычно я соглашаюсь с вами, но когда дело доходит до меню, каждый пункт меню отвечает за другое в программе или, по крайней мере, отвечает за вызов разных методов в программе. – user3593486

ответ

1

Я думаю, что понимаю, что вы имеете в виду, но я также думаю, что когда вы говорите but the methods can be added at another time?, вы имеете в виду, что то, что методы делают, добавляется в другое время.

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

  • Отображение текста фактического меню (назовем его название);
  • Показан наконечник инструмента;
  • Выполнение чего-то при нажатии.
  • Деталь подменю.

Для достижения этой цели, вы можете использовать один или сочетание двух вещей:

  1. В strategy шаблон проектирования.
  2. Аннотация классов.

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

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

Таким образом, я считаю, что лучший результат будет где-то посередине.

Например, вы можете создать свой Menu родительский класс как abstract, с такими свойствами, как Title, Tooltip и т.д. Затем можно добавить метод, называемым onActionPerformed, который принимает в каком-то объекте, который обрабатывает то, что происходит, когда пункт меню был нажат , Наконец, вы можете создавать абстрактные методы, такие как onBeforeActionPerformed и onAfterActionPerformed, это будет по существу перехватчиками, которые позволят вам выполнять логику непосредственно перед обработкой событий и после нее.

Затем вы можете расширить класс Menu такими вещами, как NonInterceptibleMenu и понравиться обрабатывать различные сценарии.

+0

Спасибо, это именно то, что я просил. Абстрактные классы кажутся тем, что я ищу, поэтому мне нужно будет изучить это больше. Также, спасибо за этот ресурс за шаблоны проектирования. Закладка для подробного изучения. – user3593486

+0

@ user3593486: Если только одна вещь, которую пункты меню должны делать друг от друга, это то, что происходит при нажатии, шаблон дизайна поможет (это то, что делает Swing). – npinti

0

Возможно ли иметь один класс, который содержит основные компоненты меню (название, список MenuOptions и т. Д.), Но методы могут быть добавлены в другое время?

Из основного «кодирования» точки зрения, вы можете создать abstract class где вы объявляете ваши центральные компоненты (убедитесь, что они не были объявлены в private объеме), а затем записать второй класс extend Ваш абстрактный класс, где вы объявляете свои методы. Если вы не планируете, чтобы несколько классов расширяли ваш абстрактный класс, нет необходимости в создании этого разделения.

Вы не предоставили достаточного объема своего общего объема проекта, поэтому я буду отвечать на этот вопрос.

1

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

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

1

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

Вы можете добавить «методы позже». Это может быть достигнуто либо с делегатами, либо с лямбда-функциями. В Java вы, возможно, встретили аналогичную конфигурацию в Swing, когда у вас есть кнопки и кнопки прослушивания (или даже меню). Вы можете взглянуть на использование классов JMenuBar, JMenu, JMenuItem и их интерфейс, которые могут вам интересны).

Вы можете встретить много примеров, когда «методы добавляются» как анонимные классы, это было до того, лямбда-функции прибыл в Java 8