重构太经典了!
重构里面比较简单的又算是Extract Method,这是我的代码里的一个类,经过我Extract Method后,我自己是越看越喜欢:P
本来createControl方法看起来很晕得,重构够变得非常简单了,几乎不需要注释,每个方法名就是注释.
当然有时候Extract Method是很麻烦的,比如碰到很多其它外部变量时.
对于这个简单的例子,我的心得就是取个好的方法名!
/***/
/**
*@authorRey
*/

public
class
AutoSqlDataSetPage
extends
WizardPage
...
{

publicstaticfinalStringID="AutoSqlDataSetPage";

privatestaticfinalintOK=0;

privatestaticfinalintCANCEL=-1;

privateListtableList=null;

privateDataTableinitDataTable=null,resultDataTable=null;

privateTableViewerinitTableViewer=null,resultTableViewer=null;


privateString[]names=newString[]...{""};


publicAutoSqlDataSetPage()...{
super(ID);
}

privateintindex=1;//input

privateintclick=-1;

privateImageimage=null;

privateintWIDTH=40,HEIGHT=40;

privateCanvascanvas=null;

privateColumnMoveCommandcolumnMoveCommand=null;


publicvoidcreateControl(finalCompositeparent)...{

setTitle("AutoSqlDataSetWizard");
setMessage("XXXXXXXXXXXXXXXX",IMessageProvider.INFORMATION);

Compositecomposite=newComposite(parent,SWT.NULL);
GridLayoutglayout=newGridLayout(9,true);
composite.setLayout(glayout);

CompositemainBtnsComposite=createMainBtnsComposite(composite);

ButtonmainBtnAdd=createMainBtn(mainBtnsComposite,"Add");
ButtonmainBtnRemove=createMainBtn(mainBtnsComposite,"Remove");
ButtonmainBtnProperties=createMainBtn(mainBtnsComposite,"Properties");
ButtonmainBtnPreview=createMainBtn(mainBtnsComposite,"Preview");

createSeparator(composite);

createImage(composite);
createCanvas(composite);

addListener2Canvas(parent);

TableinitTable=createTable(composite);
initTableViewer=newTableViewer(initTable);
initTableViewer.setContentProvider(newColumnContentProvider());
initTableViewer.setLabelProvider(newColumnLabelProvider());

CompositetableBtnsComposite=createTableBtnsComposite(composite);

finalButtonadd=createTableBtn(tableBtnsComposite,">>");
finalButtonremove=createTableBtn(tableBtnsComposite,"<<");
finalButtonaddAll=createTableBtn(tableBtnsComposite,">>>");
finalButtonremoveAll=createTableBtn(tableBtnsComposite,"<<<");
finalButtonundo=createUndoAndRedoBtn(tableBtnsComposite,"undo");
finalButtonredo=createUndoAndRedoBtn(tableBtnsComposite,"redo");

TableresultTable=createTable(composite);
resultTableViewer=newTableViewer(resultTable);
resultTableViewer.setContentProvider(newColumnContentProvider());
resultTableViewer.setLabelProvider(newColumnLabelProvider());


/***//***********************************************************************
*MainBtns'SelectionListener
**********************************************************************/

addListener2MainBtnAdd(parent,mainBtnAdd);


/***//***********************************************************************
*TableandColumnBtns'SelectionListener
**********************************************************************/

addListener2AddBtn(add,undo,redo);

addListener2RemoveBtn(remove,undo,redo);

addListener2UndoBtn(undo);

addListener2RedoBtn(redo);

addListener2AddAllBtn(addAll,undo,redo);

addListener2RemoveAllBtn(removeAll,undo,redo);

setControl(composite);
setPageComplete(true);
}


privateCompositecreateMainBtnsComposite(Compositecomposite)...{
GridLayoutglayout;
CompositemainBtnsComposite=newComposite(composite,SWT.NULL);
GridDatagd=newGridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=9;
mainBtnsComposite.setLayoutData(gd);
glayout=newGridLayout(9,true);
mainBtnsComposite.setLayout(glayout);
returnmainBtnsComposite;
}


privateButtoncreateMainBtn(CompositemainBtnsComposite,Stringtext)...{
GridDatagd;
ButtonmainBtnAdd=newButton(mainBtnsComposite,SWT.PUSH);
mainBtnAdd.setText(text);
gd=newGridData(GridData.FILL_HORIZONTAL);
mainBtnAdd.setLayoutData(gd);
returnmainBtnAdd;
}


privatevoidcreateSeparator(Compositecomposite)...{
GridDatagd;
Labellabel=newLabel(composite,SWT.SEPARATOR|SWT.HORIZONTAL);
gd=newGridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan=9;
label.setLayoutData(gd);
}


privatevoidcreateCanvas(Compositecomposite)...{
GridDatagd;
canvas=newCanvas(composite,SWT.NO_REDRAW_RESIZE|SWT.V_SCROLL
|SWT.H_SCROLL);
gd=newGridData(GridData.FILL_BOTH);
gd.horizontalSpan=9;
canvas.setLayoutData(gd);
}


privatevoidaddListener2Canvas(finalCompositeparent)...{
finalPointorigin=newPoint(0,0);

finalScrollBarhBar=canvas.getHorizontalBar();

hBar.addListener(SWT.Selection,newListener()...{

publicvoidhandleEvent(Evente)...{
inthSelection=hBar.getSelection();
intdestX=-hSelection-origin.x;
Rectanglerect=image.getBounds();
canvas.scroll(destX,0,0,0,rect.width,rect.height,false);
origin.x=-hSelection;
}
});
finalScrollBarvBar=canvas.getVerticalBar();

vBar.addListener(SWT.Selection,newListener()...{

publicvoidhandleEvent(Evente)...{
intvSelection=vBar.getSelection();
intdestY=-vSelection-origin.y;
Rectanglerect=image.getBounds();
canvas.scroll(0,destY,0,0,rect.width,rect.height,false);
origin.y=-vSelection;
}
});

canvas.addListener(SWT.Resize,newListener()...{

publicvoidhandleEvent(Evente)...{
Rectanglerect=image.getBounds();
Rectangleclient=canvas.getClientArea();
hBar.setMaximum(rect.width);
vBar.setMaximum(rect.height);
hBar.setThumb(Math.min(rect.width,client.width));
vBar.setThumb(Math.min(rect.height,client.height));
inthPage=rect.width-client.width;
intvPage=rect.height-client.height;
inthSelection=hBar.getSelection();
intvSelection=vBar.getSelection();

if(hSelection>=hPage)...{
if(hPage<=0)
hSelection=0;
origin.x=-hSelection;
}

if(vSelection>=vPage)...{
if(vPage<=0)
vSelection=0;
origin.y=-vSelection;
}
canvas.redraw();
}
});

canvas.addListener(SWT.Paint,newListener()...{

publicvoidhandleEvent(Evente)...{
GCgc=e.gc;
gc.drawImage(image,origin.x,origin.y);
Rectanglerect=image.getBounds();
Rectangleclient=canvas.getClientArea();
intmarginWidth=client.width-rect.width;

if(marginWidth>0)...{
gc.fillRectangle(rect.width,0,marginWidth,client.height);
}
intmarginHeight=client.height-rect.height;

if(marginHeight>0)...{
gc
.fillRectangle(0,rect.height,client.width,
marginHeight);
}
}
});


canvas.addMouseListener(newMouseListener()...{


publicvoidmouseDown(MouseEvente)...{
intx=e.x,y=e.y;
intmin=HEIGHT,max=HEIGHT+HEIGHT;

if(WIDTH<x&&x<WIDTH+WIDTH)...{

for(inti=0;i<index;i++)...{

if(min<y&&y<max)...{

click=i;

createImage(parent);
canvas.redraw();
break;
}
min=max+HEIGHT;
max=min+HEIGHT;
}
}
}


publicvoidmouseDoubleClick(MouseEvente)...{
}


publicvoidmouseUp(MouseEvente)...{
}
});
}


privatevoidcreateImage(finalCompositeparent)...{
intCANVAS_WIDTH=3*WIDTH,CANVAS_HEIGHT=(2*index+1)*HEIGHT;
image=newImage(parent.getDisplay(),CANVAS_WIDTH,CANVAS_HEIGHT);
GCgc=newGC(image);

drawTable(parent,gc,names);

drawLine(gc);

gc.dispose();
}


privatevoiddrawLine(GCgc)...{

for(inti=0,x=(int)(WIDTH+0.5*WIDTH),y=2*HEIGHT;i<index-1;i++)...{
gc.drawLine(x,y,x,y+HEIGHT);
y=y+HEIGHT;
y+=HEIGHT;
}
}


privatevoiddrawTable(finalCompositeparent,GCgc,String[]name)...{

for(inti=0,x=WIDTH,y=HEIGHT;i<index;i++)...{
if(i>0)
y+=2*HEIGHT;


if(i==click)...{
gc.drawRectangle(x,y,WIDTH,HEIGHT);
gc.setBackground(parent.getShell().getDisplay().getSystemColor(
SWT.COLOR_CYAN));
gc.fillRectangle(x+1,y+1,WIDTH-1,HEIGHT-1);
gc.drawText(name[i],x+5,y+5);

}else...{
gc.setBackground(parent.getShell().getDisplay().getSystemColor(
SWT.COLOR_WHITE));
gc.drawRectangle(x,y,WIDTH,HEIGHT);
gc.drawText(name[i],x+5,y+5);
}
}
}


privateTablecreateTable(Compositecomposite)...{
Tabletable=newTable(composite,SWT.MULTI|SWT.FULL_SELECTION
|SWT.BORDER);
GridDatagd;
TableColumntc=newTableColumn(table,SWT.LEFT);
tc.setWidth(100);
tc.setText("name");
tc=newTableColumn(table,SWT.LEFT);
tc.setWidth(100);
tc.setText("type");
table.setHeaderVisible(true);
table.setLinesVisible(true);

gd=newGridData();
gd.horizontalAlignment=GridData.FILL;
gd.verticalAlignment=GridData.FILL;
gd.grabExcessHorizontalSpace=true;
gd.horizontalSpan=4;
table.setLayoutData(gd);
returntable;
}


privateCompositecreateTableBtnsComposite(Compositecomposite)...{
GridLayoutglayout;
GridDatagd;
CompositetableBtnsComposite=newComposite(composite,SWT.NULL);
gd=newGridData(GridData.FILL_VERTICAL);
gd.horizontalAlignment=GridData.FILL;
gd.horizontalSpan=1;
tableBtnsComposite.setLayoutData(gd);
glayout=newGridLayout(1,true);
tableBtnsComposite.setLayout(glayout);
returntableBtnsComposite;
}


privateButtoncreateTableBtn(CompositetableBtnsComposite,Stringtext)...{
GridDatagd;
Buttonbtn=newButton(tableBtnsComposite,SWT.PUSH);
btn.setText(text);
gd=newGridData(GridData.FILL_HORIZONTAL);
btn.setLayoutData(gd);
returnbtn;
}

privateButtoncreateUndoAndRedoBtn(CompositetableBtnsComposite,

Stringtext)...{
GridDatagd;
finalButtonbtn=newButton(tableBtnsComposite,SWT.PUSH);
btn.setText(text);
btn.setEnabled(false);
gd=newGridData(GridData.FILL_HORIZONTAL);
btn.setLayoutData(gd);
returnbtn;
}

privatevoidaddListener2MainBtnAdd(finalCompositeparent,

ButtonmainBtnAdd)...{

mainBtnAdd.addSelectionListener(newSelectionAdapter()...{
@Override

publicvoidwidgetSelected(SelectionEvente)...{
//TODO
SelectJoinTableDialogsjtd=newSelectJoinTableDialog(parent
.getShell());
sjtd.setInput(tableList);
sjtd.open();
intreturnCode=sjtd.getReturnCode();

if(returnCode==OK)...{
Object[]result=sjtd.getResult();
DataTabledt=(DataTable)result[0];
index++;

createImage(parent);
canvas.redraw();
}
}
});
}

privatevoidaddListener2AddBtn(Buttonadd,finalButtonundo,

finalButtonredo)...{

add.addSelectionListener(newSelectionAdapter()...{
@Override

publicvoidwidgetSelected(SelectionEvente)...{
StructuredSelectionselection=(StructuredSelection)initTableViewer
.getSelection();
columnMoveCommand=newColumnMoveCommand(initDataTable,
resultDataTable,selection);
columnMoveCommand.execute();
undo.setEnabled(true);
redo.setEnabled(true);

}
});
}

privatevoidaddListener2RemoveBtn(Buttonremove,finalButtonundo,

finalButtonredo)...{

remove.addSelectionListener(newSelectionAdapter()...{
@Override

publicvoidwidgetSelected(SelectionEvente)...{
StructuredSelectionselection=(StructuredSelection)resultTableViewer
.getSelection();
columnMoveCommand=newColumnMoveCommand(resultDataTable,
initDataTable,selection);
columnMoveCommand.execute();
undo.setEnabled(true);
redo.setEnabled(true);
}
});
}


privatevoidaddListener2UndoBtn(finalButtonundo)...{

undo.addSelectionListener(newSelectionAdapter()...{
@Override

publicvoidwidgetSelected(SelectionEvente)...{
columnMoveCommand.undo();
}
});
}


privatevoidaddListener2RedoBtn(finalButtonredo)...{

redo.addSelectionListener(newSelectionAdapter()...{
@Override

publicvoidwidgetSelected(SelectionEvente)...{
columnMoveCommand.redo();
}
});
}

privatevoidaddListener2AddAllBtn(ButtonaddAll,finalButtonundo,

finalButtonredo)...{

addAll.addSelectionListener(newSelectionAdapter()...{
@Override

publicvoidwidgetSelected(SelectionEvente)...{
columnMoveCommand=newColumnMoveCommand(initDataTable,
resultDataTable);
columnMoveCommand.execute();
undo.setEnabled(true);
redo.setEnabled(true);

}
});
}

privatevoidaddListener2RemoveAllBtn(ButtonremoveAll,finalButtonundo,

finalButtonredo)...{

removeAll.addSelectionListener(newSelectionAdapter()...{
@Override

publicvoidwidgetSelected(SelectionEvente)...{
columnMoveCommand=newColumnMoveCommand(resultDataTable,
initDataTable);
columnMoveCommand.execute();
undo.setEnabled(true);
redo.setEnabled(true);

}
});
}


publicvoidonEnterPage()...{
AutoDataSetWizardControllercontroller=((AutoDataSetWizard)getWizard())
.getController();
tableList=controller.getTableList();
initDataTable=controller.getSelectedTable();
initTableViewer.setInput(initDataTable);

resultDataTable=DoradoFactory.eINSTANCE.createDataTable();
resultTableViewer.setInput(resultDataTable);

setNames();

redrawImage();
}


privatevoidsetNames()...{
names=newString[tableList.size()];
inti=0;

for(Iteratorit=tableList.iterator();it.hasNext();i++)...{
DataTabletable=(DataTable)it.next();
names[i]=table.getName();
}
}


privatevoidredrawImage()...{
Compositeparent=canvas.getParent();
createImage(parent);
canvas.redraw();
}


privateclassColumnContentProviderimplementsIStructuredContentProvider...{

publicObject[]getElements(ObjectinputElement)...{
DataTabletable=(DataTable)inputElement;
returntable.getColumns().toArray();
}


publicvoiddispose()...{
}


publicvoidinputChanged(Viewerviewer,ObjectoldInput,ObjectnewInput)...{
}
}


privateclassColumnLabelProviderimplementsITableLabelProvider...{

publicImagegetColumnImage(Objectelement,intcolumnIndex)...{
returnnull;
}


publicStringgetColumnText(Objectelement,intcolumnIndex)...{
Columncolumn=(Column)element;
Stringtext="";


switch(columnIndex)...{
case0:
text=column.getName();
break;
case1:
text=column.getType();
break;
}
returntext;
}


publicvoidaddListener(ILabelProviderListenerlistener)...{
}


publicvoiddispose()...{
}


publicbooleanisLabelProperty(Objectelement,Stringproperty)...{
returnfalse;
}


publicvoidremoveListener(ILabelProviderListenerlistener)...{
}
}


privateclassColumnMoveCommand...{
DataTablesrc,dest;

Listcolumns;

StructuredSelectionselection;


publicColumnMoveCommand(DataTablesrc,DataTabledest)...{
this.src=src;
this.dest=dest;
columns=newArrayList();

for(Iteratorit=src.getColumns().iterator();it.hasNext();)...{
Columncolumn=(Column)it.next();
columns.add(column);
}

}

publicColumnMoveCommand(DataTablesrc,DataTabledest,

StructuredSelectionselection)...{
this.src=src;
this.dest=dest;
this.selection=selection;
columns=newArrayList();

for(Iteratorit=selection.iterator();it.hasNext();)...{
Columncolumn=(Column)it.next();
columns.add(column);
}
}


publicvoidexecute()...{

for(Iteratorit=columns.iterator();it.hasNext();)...{
Columnc=(Column)it.next();
src.getColumns().remove(c);
dest.getColumns().add(c);
}
refreshTable();
}


publicvoidundo()...{

for(Iteratorit=columns.iterator();it.hasNext();)...{
Columnc=(Column)it.next();
src.getColumns().add(c);
dest.getColumns().remove(c);
}
refreshTable();
}


publicvoidredo()...{
execute();
}


privatevoidrefreshTable()...{
initTableViewer.refresh();
resultTableViewer.refresh();
}
}

}