Pattern per separare il codice UI dalla logica in Wicket

1

Utilizzo Apache Wicket per lo sviluppo di app web, ne ho sviluppate alcune nell'ultimo anno ed è stato fantastico; oggi stavo guardando alcune pagine e la maggior parte di esse assomiglia a questo:

public class MyPage extends MyBasePage
{
    public MyPage() {
        constructUI();
    }


    private void constructUI() {
        //first build all the models..
        IModel aModel = new SomeModel(new SimeObject());

        //then build forms, links and buttons like this
        Form myForm = new Form("myForm", aModel) {

            //notice that the submit logic is not implemented here
            private void onSubmit() {
                myForm_submit();
            }
        }
    }

    private void myForm_submit() {
        //handle the form submision here, validation, service calling etc..
    }
}

Di solito gestisco l'invio del modulo e il link / clic del pulsante su metodi separati per mantenere il metodo constructUI il più breve possibile, la maggior parte delle pagine ha 1 o 2 griglie e 2-3 moduli per azioni diverse, per il mio esigenze specifiche e casi d'uso questa pratica mi dà questi benefici:

  • L'interfaccia utente può essere costruita / decostruita in diversi modi (per rifattare il markup ad esempio) senza dover copiare / incollare / spostare l'intera logica di gestione dell'invio

  • Avendo *_submit , *_click metodi permette di navigare facilmente nella classe usando "ctrl + o" (su Eclipse) per filtrare e trovare metodi

Quindi la mia domanda è, se esiste qualche pattern software che permetta di separare la logica "constructUI" in una classe diversa, o qualcosa di simile, perché alcune pagine sono pesanti (anche usando componenti personalizzati) e "constructUI" diventa troppo grande.

    
posta Harima555 18.02.2015 - 17:11
fonte

2 risposte

1

Se le tue pagine diventano grandi prova a scomporle in Panel s più piccoli.

Non mi piace nel tuo codice che tu abbia un solo metodo nel costruttore. Se è così vorrei omettere questo metodo e scrivere tutto nel costruttore.

Utilizziamo un approccio in cui ogni componente viene creato all'interno di una funzione e restituito da lì. Questo ci consente di mantenere tutte le informazioni su un componente in un unico posto. Inoltre il nome della funzione che restituisce il componente è lo stesso del suo wicket: id. Questo aiuta ulteriormente a leggere meglio il codice tra java e html. Le nostre pagine / pannelli assomigliano a questo:

public class MyPage extends MyBasePage
{

    Form form;

    public MyPage() {
        form = form();
        form.add(submit());
    }


    private Form form() {
        Form myForm = new Form("form", aModel);
        myForm.setOutputMarkupPlaceholderTag(true);
        return myForm;
    }

    private AjaxSubmitLink submit(){
        AjaxSubmitLink asl = new AjaxSubmitLink("submit") {

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                someService.saveSomeEntity(aEntity);
                target.add(aFeedbackPanel);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                target.add(aFeedbackPanel);
            }

            @Override
            protected void onConfigure() {
                setVisible(ifSomeCondition());
                setEnabled(ifSomeOtherCondition());
            }


        };
        asl.setOutputMarkupId(true);
        asl.add(new SomeBehavior());
        return asl;
    }
}
    
risposta data 20.02.2015 - 00:11
fonte
1

Wicket ha diversi cicli per costruire l'albero dei componenti e renderlo. Capire quei cicli ti aiuterà a evitare di creare componenti nel costruttore, che gli autori di Apache Wicket considerano un cattive pratiche perché può potenzialmente aumentare le dimensioni della tua sessione. Prova a scrivere il codice che inserisce gli oggetti del modello nei campi, attiva l'istanza nei metodi di aggiunta in un metodo sovrascritto onInitialize e imposta la visibilità nei metodi onConfigure sovrascritti.

public class MyPage extends MyBasePage
{

private Form<MyModel> form;
private Model<MyModel> aModel;

public MyPage(PageParameters parms, MyModel aModel) {
    super(parms);
    this.aModel = aModel;

}

    @Override
    public void OnInitialize(){
        add(form(aModel));
    }


private Form<MyModel> form(Model aModel) {
    Form<MyModel> myForm = new Form("form", aModel){
        private static final long serialVersionUID = 1L;

        @Override
        private void onInitialize(){
        add(submit());
        }
    }
}

private AjaxSubmitLink submit(){
    AjaxSubmitLink submit = new AjaxSubmitLink("submit") {
    private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<MyModel form> form) {
            target.add(anAjaxRenderedComponent());
        }

        @Override
        protected void onError(AjaxRequestTarget target, Form<MyModel> form) {
            target.add(anErrorPanel());
        }

        @Override
        protected void onConfigure() {
            setVisible(someBooleanReturningMethod());
            setOutputMarkupPlaceHolderTag(true);

        }


    };
    return submit;
}
    
risposta data 15.01.2016 - 03:06
fonte

Leggi altre domande sui tag