Gruppövning Applikationsprogramering Klassuppdelning Loose Coupling Model View Controller Inversion of Control Layout med Swing JSplitPane Mouse-over Events
Klassupdelning Vad vinner vi på att dela upp koden? Läsbarhet Återandvändbara modeuler Separat testning och utväcling av komponenter Hur delar vi upp koden? Loose Coupling Design Patterns
Loose Coupling Dåligt med Tight Coupling Ändringar i en modul får konsekvenser i andra moduler Svårt att testa en modul i taget Interfaces Små gränssnitt som gör en uppgift väl Om inte gränssnittet ändras behöver inte andra moduler ändras En klass kan implementera många gränssnitt
Typer av Gränssnitt Callback interface Delegate { void call(T t); } Callforth? Finns det bra namn? interface Set { void add(T t); boolean has(T t); void remove(T t); }
Model View Controler En model som inehåller programmets data En vy som ritar upp programmet gränssnitt En controller som tar event från båda parter och beslutar vilka komandon som ska köras
MVC Exempel interface View{//GUI void registerTextCallback(Delegate calback); void displayResults(String result); }interface Model{//Backend String calculateResult(Strnig input); }class Controller{ public static void main(String[] args){ View v=...;Model m=...;//some stuf to create objects v.registerTextCallback(new Delegate { public call(String t){ v.displayResults(m.calculateResults(t)); }}); } }//end main,end class
MVC-Exempelförklaring Varför en Controller? En händelse i View kan orsaka flera händelser i Model Om View inte behöver veta vad som händer när en knapp trycks på blir det enklare att skriva Översättning av typer En String från View översätts till en Integer Slippa leta i View om man vill byta Model
Slutsats MVC Vad vinner vi på MVC? Modularitet Lättare att byta ut delar Tydlig uppdelning mellan gränssnitts kod och program logik
Inversion of Control Ett sätt att hålla koll på vilka resurser en class kan använda Får mig att tänka på Pure-Functions Idé En klass använder endast de object som den fått via sin konstructor och methoder.
Inversion of Control Vad är det bra för? Det gör att vi kan vara säkra på att klassen inte ändrar globalt data (om vi är konsekventa) Vi får möjlighet att ändra vilka object klassen använder Tex peka om utdata ström för VISSA instancer Om vi har mer koll över vilken data som används blir trådsäker kod enklare
Swing Layout JSplitPane exempel //Create a split pane with the two scroll panes splitPane = new JsplitPane( JSplitPane.HORIZONTAL_SPLIT, listScrollPane, pictureScrollPane); splitPane.setOneTouchExpandable(true); splitPane.setDividerLocation(150); //Provide minimum sizes for the two components Dimension minimumSize = new Dimension(100, 50); listScrollPane.setMinimumSize(minimumSize); pictureScrollPane.setMinimumSize(minimumSize);
Oläsligt Mouse over Exempel public class Test {// private MouseMotionListener listener = new MouseMotionAdapter() { private int oldIx = -1; public void mouseMoved( MouseEvent e ) { JTabbedPane tp = (JTabbedPane)e.getSource(); int ix = tp.indexAtLocation( e.getX(), e.getY() ); if ( ix == oldIx )return; oldIx = ix; if ( ix == -1 )return; System.out.println("You're over tab " + ix ); } }; private void createAndShowGUI() { JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addMouseMotionListener( listener ); tabbedPane.addTab( "Tab 1", new JPanel() ); tabbedPane.addTab( "Tab 2", new JPanel() ); JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE ); frame.getContentPane().add( tabbedPane ); frame.pack(); frame.setVisible(true); } public static final void main( String args[] ) { new Test().createAndShowGUI(); }