J'implémente le frontend d'une application dans GWT (voir image ci-jointe) et j'ai une classe view qui s'agrandit à mesure que de nouveaux widgets sont ajoutés au frontend. Comme indiqué dans le tutoriel GWT, la classe view doit implémenter l'interface Display de la classe de présentation. Le problème est que j'ai beaucoup de méthodes dans cette interface et que je les implémente dans la classe de vue, cela devient trop grand. C'est pourquoi je voudrais refactoriser le code pour réduire la taille de la classe de vue en implémentant ces méthodes dans d'autres classes et les référencer si nécessaire dans la classe view, par exemple en les regroupant par boîte de groupe (une classe par boîte de groupe) . Ci-dessous un exemple de code: Notez que dans l'application réelle, nous avons plus de widgets par boîte de groupe. Le problème auquel je suis confronté sera bien expliqué au fur et à mesure que vous lirez tout le message, car j'ajouterai plus de détails.Refactorisation d'une classe implémentant une interface en créant des sous-classes dans GWT/java
Codeà refactorisé:
ContactPrewsenter.java
public class ContactPresenter {
public interface Display
{
void methodA();
void methodB();
void methodC();
void methodD();
void methodE();
void methodF();
.
.
.
void methodM();
}
public ContactPresenter()
{
//Some stuff here
}
......
......
@Override
public void bind(){
//Some stuff here
}
}
ContactView.java:
public class ContactView implements ContactPresenter.Display
{
private final Listbox listBoxA;
private final Listbox listBoxB;
private final Listbox listBoxC;
private final Listbox listBoxD;
private final Listbox listBoxE;
private final Listbox listBoxF;
private final Listbox listBoxG;
private final Listbox listBoxH;
private final Listbox listBoxI;
private final Listbox listBoxJ;
private final Listbox listBoxK;
private final Listbox listBoxL;
private final Listbox listBoxM;
public ContactView()
{
listBoxA = new ListBox();
listBoxB = new ListBox();
VerticalPanel vPanel1= new VerticalPanel();
vPanel1.add(listBoxA);
vPanel1.add(listBoxB);
GrooupBox groupBox1 = new GroupBox();
groupBox1.add(vPanel1);
listBoxC = new ListBox();
listBoxD = new ListBox();
VerticalPanel vPanel2 = new VerticalPanel();
vPanel2.add(listBoxC);
vPanel2.add(listBoxD);
GrooupBox groupBox2 = new GroupBox();
groupBox2.add(vPanel2);
listBoxE = new ListBox();
listBoxF = new ListBox();
VerticalPanel vPanel3 = new VerticalPanel();
vPanel3.add(listBoxE);
vPanel3.add(listBoxF);
GrooupBox groupBox3 = new GroupBox();
groupBox3.add(vPanel3);
listBoxE = new ListBox();
listBoxF = new ListBox();
VerticalPanel vPanel4 = new VerticalPanel();
vPanel4.add(ListBoxE);
vPanel4.add(ListBoxF);
....
GrooupBox groupBox3 = new GroupBox();
groupBox3.add(vPanel4);
listBoxG = new ListBox();
listBoxH = new ListBox();
....
VerticalPanel vPanel = new VerticalPanel();
vPanel.add(ListBoxG);
vPanel.add(ListBoxH);
....
GrooupBox groupBox4 = new GroupBox();
groupBox4.add(vPanel);
......
//create Horizontal/vertical panels, docklayout panel as well, to position the group boxes on the gui
....
}
@Override
void methodA(){
//uses listBoxA
}
@Override
void methodB(){
//used listBoxB
}
@Override
void methodC(){
//uses listBoxC
}
@Override
void methodD(){
//uses listBoxD
}
@Override
void methodE(){
//uses listBoxE
}
@Override
void methodF(){
//uses listBoxF
}
@Override
void methodG(){
//uses listBoxG
}
@Override
void methodH(){
//uses listBoxH
}
.
.
.
@Override
void methodM(){
//uses listBoxM
}
}
J'ai essayé comme suit:
ContactPreseter.java
public class ContactPresenter
{
public interface Display extends groupBox1View.Display, groupBox2View.Display, groupBox3View.Display, groupBox4View.Display
{
}
}
classes preseter de chaque zone de groupe
public class groupBox1Presenter
{
public interface Display
{
void methodA();
void methodB();
}
}
public class groupBox2Presenter
{
public interface Display
{
void methodC();
void methodD();
}
}
public class groupBox3Presenter
{
public interface Display
{
void methodE();
void methodF();
}
}
public class groupBox4Presenter
{
public interface Display
{
void methodG();
void methodH();
}
}
ContactView.java
public abstract class ContactView implements ContactPresenter.Display
{
// adds group boxes to horizontal/vertical panels, and docklayout panel
}
Voici les classes d'affichage pour chaque zone de groupe:
Mais ici, j'éclipse me force à mettre en œuvre tous les méthodes de l'interface ContactPresenter.Display dans chacune de ces classes alors que, je voulais que ce soit la façon dont vous voyez implémenté ici.
Je me demandais s'il y avait un moyen de jouer avec les modificateurs d'accès pour y parvenir? Si non, s'il vous plaît je voudrais vous aider avec des idées comment le faire?
public groupBox1View extends ContactView implements groupBox1Presenter
{
public groupBox1View()
{
}
@Override
void methodA(){
//uses listBoxA
}
@Override
void methodB(){
//used listBoxB
}
}
public groupBox2View extends ContactView implements groupBox2Presenter
{
public groupBox2View()
{
}
@Override
void methodC(){
//uses listBoxC
}
@Override
void methodD(){
//used listBoxD
}
}
public groupBox3View extends ContactView implements groupBox3Presenter
{
public groupBox3View()
{
}
@Override
void methodE(){
//uses listBoxE
}
@Override
void methodF(){
//used listBoxF
}
}
public groupBox4View extends ContactView implements groupBox4Presenter
{
public groupBox4View()
{
}
@Override
void methodG(){
//uses listBoxG
}
@Override
void methodH(){
//used listBoxH
}
}
Merci pour votre réponse. Je ne suis pas sûr de bien comprendre ce que vous voulez dire. Pourriez-vous s'il vous plaît écrire un exemple de code pour m'aider à mieux le comprendre? Ça me plairait vraiment :) –