web-dev-qa-db-ja.com

入力ダイアログのコントローラークラス

修理工場向けの実際のビジネスアプリケーションを開発することにより、OOP、具体的にはJavaを学んでいます。私はアプリケーションのGUI要素のMVCパターン設計に従いました。私の入力ダイアログコントローラークラスには多くの責任があるのだろうかと思っていました。 ComboBoxモデル、ボタンActionListenersを設定し、ユーザー入力を確認し、入力エラーを表示し、モデルにデータを保存します。それは多くの責任に関係していますか、それとも実際には単一の責任であり、ビューとモデルを結び付けていますか?このウェブサイトで this topic を知っています。

================================================== =========================

これは、すべての入力ダイアログコントローラーのスーパークラスである、抽象的な入力ダイアログコントローラークラスです。 IDラベル値の設定、[追加]ボタンと[キャンセル]ボタンのActionListenerの設定を担当し、データを保存する入力コントローラーの主な機能を備えています。

    public abstract class InputDialogController implements WindowController
    {
        protected DataType dataType;
        protected int id;
        protected InputDialog gui;

        protected InputDialogController(WindowController owner, DataType dataType)
        {
            this.dataType = dataType;
            gui = InputDialogFactory.getWindow(owner.getWindow(), dataType);
            id = IDGenerator.getNewID(dataType);
            gui.getIdPanel().setIdValue(IDGenerator.formatRegularID(id));
            gui.getInputButtonPanel().setBtnAddActionListener(ActionListenerFactory.saveData(this));
            gui.getInputButtonPanel().setBtnCancelActionListener(ActionListenerFactory.closeWindow(this));
        }

        @Override
        public Window getWindow()
        {
            return (Window) gui;
        }

        public void trySavingDataElement()
        {
            if(isInputValid())
            {
                DataManager.save(createDataElement());
                getWindow().dispose();
            }
            else
            {
                showInputErrors();
            }
        }

        protected abstract boolean isInputValid();

        protected abstract DataElement createDataElement();

        protected abstract void showInputErrors();
    }

これは私の具体的な入力ダイアログコントローラーの1つであるClientRegistrationControllerクラスです。

public class ClientRegistrationController extends InputDialogController
{
    private ClientRegistrationDialog clientGUI;

    public ClientRegistrationController(WindowController owner, DataType dataType)
    {
        super(owner, dataType);
        clientGUI = (ClientRegistrationDialog) super.gui;
        clientGUI.getMarketingPanel().setMarketingCmbModel(CmbModelFactory.getModel(dataType));
        clientGUI.getMarketingPanel()
                 .setBtnMarketingActionListener(ActionListenerFactory
                 .openNewWindow(this, DataType.MARKETING_TYPE));

    }

    public void updateComboBoxes(String item)
    {
        clientGUI.getMarketingPanel().setMarketing(item);
    }

    @Override
    protected boolean isInputValid()
    {
        return isNameValid()
            && isPhoneNumberValid()
            && isMarketingSelected();
    }

    private boolean isNameValid( )
    {
        return !("".equals(clientGUI.getPersonalInfoPanel().getName()));
    }

    private boolean isPhoneNumberValid()
    {
        String phoneNumber = clientGUI.getPersonalInfoPanel().getPrimePhoneNumber();

        return !(DataManager.clientsDataTable.uniqueStringCollision(phoneNumber)
             || ("".equals(phoneNumber)));
    }

    private boolean isMarketingSelected()
    {
        return clientGUI.getMarketingPanel().getMarketing() != "";
    }

    @Override
    protected Client createDataElement()
    {
        Client newClient= new Client();

        newClient.setId(id);
        newClient.setName(clientGUI.getPersonalInfoPanel().getName());
        newClient.setPrimePhoneNumber(clientGUI.getPersonalInfoPanel().getPrimePhoneNumber());
        newClient.setAlternativePhoneNumber(clientGUI.getPersonalInfoPanel().getAltPoneNumber());
        newClient.setEmail(clientGUI.getPersonalInfoPanel().getEmail());
        newClient.setAddress(clientGUI.getPersonalInfoPanel().getAddress());
        newClient.setMarketing(DataElementGetter.getMarketing(clientGUI.getMarketingPanel().getMarketing()));

        return newClient;
    }

    @Override
    protected void showInputErrors()
    {
        checkName();
        checkPhoneNumber();
        checkMarketing();
    }

    private void checkName()
    {
        if(isNameValid())
        {
            clientGUI.getPersonalInfoPanel().showNameDefault();
        }
        else
        {
            clientGUI.getPersonalInfoPanel().showNameError();
        }
    }


    private void checkPhoneNumber()
    {

        if(isPhoneNumberValid())
        {
            clientGUI.getPersonalInfoPanel().showPhoneDefault();
        }
        else
        {
            clientGUI.getPersonalInfoPanel().showPhoneError();
        }
    }

    private void checkMarketing()
    {
        if(isMarketingSelected())
        {
            clientGUI.getMarketingPanel().showMarketingDefault();
        }
        else
        {
            clientGUI.getMarketingPanel().showMarketingError();
        }
    }
}

MVCパターンを間違った方法で実装していますか?それをどのように行う必要がありますか?

1
Zoran Jankov

MVCパターンを実装/使用するには、使用するテクノロジーや個人の好みに応じて、いくつかの正しい方法があります。

MVCパターンの最も重要な側面は、allユーザーインタラクションに関連するコードが、コントローラー部分またはビュー部分、あるいはその両方に限定されることです。つまり、モデルパーツに変更を加えることなく、完全に異なるUI(たとえば、web-ui)を作成できるはずです。

どのコードをコントローラーに入れ、どのコードをビューに入れるかは、ユーザーと使用するGUIフレームワークの設計者がビュー部分にロジックを持つことの快適さに大きく依存します。あなたが提示したコントローラーコードは、ほとんどロジックを含まず完全に有効なビューとペアになっているコントローラーとかなり一致しています。