abstractie (dutch)
DESCRIPTION
De slides van mijn college over abstractie, zoals gegeven aan de Rijksuniversiteit Groningen.TRANSCRIPT
![Page 1: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/1.jpg)
![Page 2: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/2.jpg)
![Page 3: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/3.jpg)
![Page 4: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/4.jpg)
![Page 5: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/5.jpg)
![Page 6: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/6.jpg)
![Page 7: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/7.jpg)
![Page 8: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/8.jpg)
Write('A');
![Page 9: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/9.jpg)
abstractie
![Page 10: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/10.jpg)
wat?waarom?hoe?valkuilenconclusie
![Page 11: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/11.jpg)
wat?
![Page 12: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/12.jpg)
“Abstraction is the process of generalization by reducing the information content of a concept in
order to retain only information which is relevant for a particular purpose.”
-- Wikipedia (ed.)
![Page 13: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/13.jpg)
waarom?
![Page 14: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/14.jpg)
![Page 15: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/15.jpg)
bestanden
mappen
multi-tasking
vensters
knoppen
invoer velden
![Page 16: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/16.jpg)
hoe?
![Page 17: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/17.jpg)
printChar('N');printChar('a');printChar('a');printChar('m');printChar(':');printChar(' ');
char[] vnBuffer = new char[255];int vnLength = 0;char inp;do { inp = readChar(); vnBuffer[vnLength] = inp; vnLength++;while (inp != '\n');
printChar('A');printChar('c');printChar('h');printChar('t');printChar('e');printChar('r');printChar('n');printChar('a');printChar('a');printChar('m');printChar(':');
char[] anBuffer = new char[255];int anLength = 0;do { inp = readChar(); anBuffer[anLength] = inp; anLength++;while (inp != '\n');
printChar('H');printChar('a');printChar('l');printChar('l');printChar('o');printChar(' ');int i = 0;while(i < vnLength) { printChar(vnBuffer[i]); i++;}printChar(' ');i = 0;while(i < anLength) { printChar(anBuffer[i]); i++;}
![Page 18: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/18.jpg)
printChar('N');printChar('a');printChar('a');printChar('m');printChar(':');printChar(' ');
char[] vnBuffer = new char[255];int vnLength = 0;char inp;do { inp = readChar(); vnBuffer[vnLength] = inp; vnLength++;while (inp != '\n');
printChar('A');printChar('c');printChar('h');printChar('t');printChar('e');printChar('r');printChar('n');printChar('a');printChar('a');printChar('m');printChar(':');
char[] anBuffer = new char[255];int anLength = 0;do { inp = readChar(); anBuffer[anLength] = inp; anLength++;while (inp != '\n');
printChar('H');printChar('a');printChar('l');printChar('l');printChar('o');printChar(' ');int i = 0;while(i < vnLength) { printChar(vnBuffer[i]); i++;}printChar(' ');i = 0;while(i < anLength) { printChar(anBuffer[i]); i++;}
![Page 19: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/19.jpg)
printChar('N');printChar('a');printChar('a');printChar('m');printChar(':');printChar(' ');
char[] vnBuffer = new char[255];int vnLength = 0;char inp;do { inp = readChar(); vnBuffer[vnLength] = inp; vnLength++;while (inp != '\n');
printChar('A');printChar('c');printChar('h');printChar('t');printChar('e');printChar('r');printChar('n');printChar('a');printChar('a');printChar('m');printChar(':');
char[] anBuffer = new char[255];int anLength = 0;do { inp = readChar(); anBuffer[anLength] = inp; anLength++;while (inp != '\n');
printChar('H');printChar('a');printChar('l');printChar('l');printChar('o');printChar(' ');int i = 0;while(i < vnLength) { printChar(vnBuffer[i]); i++;}printChar(' ');i = 0;while(i < anLength) { printChar(anBuffer[i]); i++;}
![Page 20: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/20.jpg)
printChars(new char[] { 'N', 'a', 'a', 'm', ':', ' '}, 6);char[] vnBuf = new char[255];int vnLength = readChars(vnBuf);
printChars(new char[] { 'A', 'c', 'h', 't', 'e', 'r', 'n', 'a', 'a', 'm', ':', ' '}, 12);char[] anBuf = new char[255];int anLength = readChars(vnBuf);
printChars(new char[] {'H', 'a', 'l', 'l', 'o', ' '}, 6);printChars(vnBuf, vnLength);printChars(anBuf, anLength);
![Page 21: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/21.jpg)
String voornaam = readLine("Naam: ");String achternaam = readLine("Achternaam: ");print("Hallo " + voornaam + " " + achternaam);
![Page 22: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/22.jpg)
FullName fn = FullName.read();fn.printGreeting();
![Page 23: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/23.jpg)
readNameAndPrintGreeting();
![Page 24: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/24.jpg)
goed abstractie niveau?
![Page 25: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/25.jpg)
readNameAndPrintGreeting();
nieuwe eis: vraag ook naar leeftijd
![Page 26: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/26.jpg)
readNameAndPrintGreeting();
nieuwe eis: vraag ook naar leeftijd✖
![Page 27: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/27.jpg)
FullName fn = FullName.read();fn.printGreeting();
nieuwe eis: vraag ook naar leeftijd
![Page 28: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/28.jpg)
FullName fn = FullName.read();fn.printGreeting();
nieuwe eis: vraag ook naar leeftijd✖
![Page 29: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/29.jpg)
String voornaam = readLine("Naam: ");String achternaam = readLine("Achternaam: ");print("Hallo " + voornaam + " " + achternaam);
nieuwe eis: vraag ook naar leeftijd
![Page 30: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/30.jpg)
String voornaam = readLine("Naam: ");String achternaam = readLine("Achternaam: ");int leeftijd = stringToInt(readLine("Leeftijd: "));print("Hallo " + voornaam + " " + achternaam + ", jij bent " + leeftijd + " jaar oud.");
nieuwe eis: vraag ook naar leeftijd ✔
![Page 31: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/31.jpg)
goed abstractie niveau afhankelijk van
![Page 32: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/32.jpg)
goed abstractie niveau afhankelijk van
gebruik nu
![Page 33: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/33.jpg)
goed abstractie niveau afhankelijk van
gebruik nu
gebruik later
![Page 34: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/34.jpg)
Web applicaties in Java/Seam
![Page 35: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/35.jpg)
View ControllerModel
![Page 36: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/36.jpg)
Data: Hibernate@Entitypublic class Blog { protected String _title = ""; public String getTitle() { return _title; } public void setTitle(String value) { _title = value; } @ManyToOne protected User _author; public User getAuthor() { return _author; } public void setAuthor(User author) { _title = value; } @OneToMany(mappedBy="_blog", targetEntity=BlogEntry.class) @Cascade(...) protected List<BlogEntry> _entries; public List<BlogEntry> getEntries() { return _entries; } public void setEntries(List<BlogEntry> entries) { _entries = entries; }}
![Page 37: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/37.jpg)
View: JSF<html ...> ... <body> ... <h:form> <table> <tr><td><h:outputText value="Title: "/></td><td><h:inputText value="#{editBlogEntry.e.title}" /></td></tr><tr><td><h:outputText value="Created: "/></td><td><rich:calendar value="#{editBlogEntry.e.created}" popup="true" datePattern="dd/MM/yyyy" .../></td></tr><tr><td><h:outputText value="Content: "/></td><td><h:inputTextarea value="#{editBlogEntry.e.content}"/></td></tr><tr><td><h:outputText value="Status: "/></td><td><h:selectOneMenu value="#{editBlogEntry.e.status}"> <s:selectItems value="#{editBlogEntry.blogEntryStatusList}" var="blogEntryStatus" label="#{blogEntryStatus.name}" /> <s:convertEntity/> </h:selectOneMenu></td></tr> </table> <h:actionLink action=”#{editBlogEntry.save()}”/></h:form> ... </body> </html>
![Page 38: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/38.jpg)
Controller@Stateful @Name(“editBlogEntry”)public class EditBlogEntry { ... @In @Out private BlogEntry e;
public void setE(e) { this.e = e; }
public BlogEntry getE() { return this.e; }
public void save() { em.persist(e); } ...}
![Page 39: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/39.jpg)
Configuratie<?xml version="1.0" ?><web-app ...> <context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/WEB-INF/blog.taglib.xml</param-value> </context-param> <filter> <filter-name>Seam Filter</filter-name> <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> </filter> <filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> <init-param> <param-name>logLevel</param-name> <param-value>WARN</param-value> </init-param> </filter> <filter-mapping> <filter-name>Seam Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>Seam Resource Servlet</servlet-name> <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.seam</url-pattern> </servlet-mapping> ...</web-app>
![Page 40: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/40.jpg)
allemaal hetzelfde
![Page 41: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/41.jpg)
allemaal hetzelfde
Gebruiker
![Page 42: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/42.jpg)
allemaal hetzelfde
Gebruikermakenwijzigenverwijderenkoppelen
![Page 43: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/43.jpg)
allemaal hetzelfde
Gebruikermakenwijzigenverwijderenkoppelen
Bericht
![Page 44: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/44.jpg)
allemaal hetzelfde
Gebruikermakenwijzigenverwijderenkoppelen
Berichtmakenwijzigenverwijderenkoppelen
![Page 45: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/45.jpg)
allemaal hetzelfde
Gebruikermakenwijzigenverwijderenkoppelen
Berichtmakenwijzigenverwijderenkoppelen
Reactie
![Page 46: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/46.jpg)
allemaal hetzelfde
Gebruikermakenwijzigenverwijderenkoppelen
Berichtmakenwijzigenverwijderenkoppelen
Reactiemakenwijzigenverwijderenkoppelen
![Page 47: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/47.jpg)
allemaal hetzelfde
Gebruikermakenwijzigenverwijderenkoppelen
Berichtmakenwijzigenverwijderenkoppelen
Reactiemakenwijzigenverwijderenkoppelen
boiler plate code
![Page 48: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/48.jpg)
![Page 49: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/49.jpg)
![Page 50: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/50.jpg)
Data@Entitypublic class Blog { protected String _title = ""; public String getTitle() { return _title; } public void setTitle(String value) { _title = value; } @ManyToOne protected User _author; public User getAuthor() { return _author; } public void setAuthor(User author) { _title = value; } @OneToMany(mappedBy="_blog", targetEntity=BlogEntry.class) @Cascade(...) protected List<BlogEntry> _entries; public List<BlogEntry> getEntries() { return _entries; } public void setEntries(List<BlogEntry> entries) { _entries = entries; }}
![Page 51: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/51.jpg)
Data
entity Blog { author -> User (inverse=User.blogs) title :: String entries <> Set<BlogEntry>}
@Entitypublic class Blog { protected String _title = ""; public String getTitle() { return _title; } public void setTitle(String value) { _title = value; } @ManyToOne protected User _author; public User getAuthor() { return _author; } public void setAuthor(User author) { _title = value; } @OneToMany(mappedBy="_blog", targetEntity=BlogEntry.class) @Cascade(...) protected List<BlogEntry> _entries; public List<BlogEntry> getEntries() { return _entries; } public void setEntries(List<BlogEntry> entries) { _entries = entries; }}
![Page 52: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/52.jpg)
Pagina’s<html ...> ... <body> ... <h:form> <table> <tr><td><h:outputText value="Title: "/></td><td><h:inputText value="#{editBlogEntry.e.title}" /></td></tr><tr><td><h:outputText value="Created: "/></td><td><rich:calendar value="#{editBlogEntry.e.created}" popup="true" datePattern="dd/MM/yyyy" .../></td></tr><tr><td><h:outputText value="Content: "/></td><td><h:inputTextarea value="#{editBlogEntry.e.content}"/></td></tr><tr><td><h:outputText value="Status: "/></td><td><h:selectOneMenu value="#{editBlogEntry.e.status}"> <s:selectItems value="#{editBlogEntry.blogEntryStatusList}" var="blogEntryStatus" label="#{blogEntryStatus.name}" /> <s:convertEntity/> </h:selectOneMenu></td></tr> </table> <h:actionLink action=”#{editBlogEntry.save()}”/></h:form> ... </body> </html>
@Stateful @Name(“editBlogEntry”)public class EditBlogEntry { ... @In @Out private BlogEntry e;
public void setE(e) { this.e = e; }
public BlogEntry getE() { return this.e; }
public void save() { em.persist(e); } ...}
![Page 53: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/53.jpg)
Pagina’s
define page editBlogEntry(e : BlogEntry) { form{ table{ row{ "Title: " input(e.title) } row{ "Created: " input(e.created) } row{ "Content: " input(e.content) } row{ "Status: " input(e.status) } action("Save", save()) } } action save() { e.save(); return blogEntry(e); }}
<html ...> ... <body> ... <h:form> <table> <tr><td><h:outputText value="Title: "/></td><td><h:inputText value="#{editBlogEntry.e.title}" /></td></tr><tr><td><h:outputText value="Created: "/></td><td><rich:calendar value="#{editBlogEntry.e.created}" popup="true" datePattern="dd/MM/yyyy" .../></td></tr><tr><td><h:outputText value="Content: "/></td><td><h:inputTextarea value="#{editBlogEntry.e.content}"/></td></tr><tr><td><h:outputText value="Status: "/></td><td><h:selectOneMenu value="#{editBlogEntry.e.status}"> <s:selectItems value="#{editBlogEntry.blogEntryStatusList}" var="blogEntryStatus" label="#{blogEntryStatus.name}" /> <s:convertEntity/> </h:selectOneMenu></td></tr> </table> <h:actionLink action=”#{editBlogEntry.save()}”/></h:form> ... </body> </html>
@Stateful @Name(“editBlogEntry”)public class EditBlogEntry { ... @In @Out private BlogEntry e;
public void setE(e) { this.e = e; }
public BlogEntry getE() { return this.e; }
public void save() { em.persist(e); } ...}
![Page 54: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/54.jpg)
Pagina’s<html ...> ... <body> ... <h:form> <table> <tr><td><h:outputText value="Title: "/></td><td><h:inputText value="#{editBlogEntry.e.title}" /></td></tr><tr><td><h:outputText value="Created: "/></td><td><rich:calendar value="#{editBlogEntry.e.created}" popup="true" datePattern="dd/MM/yyyy" .../></td></tr><tr><td><h:outputText value="Content: "/></td><td><h:inputTextarea value="#{editBlogEntry.e.content}"/></td></tr><tr><td><h:outputText value="Status: "/></td><td><h:selectOneMenu value="#{editBlogEntry.e.status}"> <s:selectItems value="#{editBlogEntry.blogEntryStatusList}" var="blogEntryStatus" label="#{blogEntryStatus.name}" /> <s:convertEntity/> </h:selectOneMenu></td></tr> </table> <h:actionLink action=”#{editBlogEntry.save()}”/></h:form> ... </body> </html>
@Stateful @Name(“editBlogEntry”)public class EditBlogEntry { ... @In @Out private BlogEntry e;
public void setE(e) { this.e = e; }
public BlogEntry getE() { return this.e; }
public void save() { em.persist(e); } ...}
![Page 55: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/55.jpg)
Pagina’s
define page editBlogEntry(e : BlogEntry) { derive editPage from e}
<html ...> ... <body> ... <h:form> <table> <tr><td><h:outputText value="Title: "/></td><td><h:inputText value="#{editBlogEntry.e.title}" /></td></tr><tr><td><h:outputText value="Created: "/></td><td><rich:calendar value="#{editBlogEntry.e.created}" popup="true" datePattern="dd/MM/yyyy" .../></td></tr><tr><td><h:outputText value="Content: "/></td><td><h:inputTextarea value="#{editBlogEntry.e.content}"/></td></tr><tr><td><h:outputText value="Status: "/></td><td><h:selectOneMenu value="#{editBlogEntry.e.status}"> <s:selectItems value="#{editBlogEntry.blogEntryStatusList}" var="blogEntryStatus" label="#{blogEntryStatus.name}" /> <s:convertEntity/> </h:selectOneMenu></td></tr> </table> <h:actionLink action=”#{editBlogEntry.save()}”/></h:form> ... </body> </html>
@Stateful @Name(“editBlogEntry”)public class EditBlogEntry { ... @In @Out private BlogEntry e;
public void setE(e) { this.e = e; }
public BlogEntry getE() { return this.e; }
public void save() { em.persist(e); } ...}
![Page 56: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/56.jpg)
![Page 57: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/57.jpg)
10-50x
![Page 58: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/58.jpg)
WebDSL code
WebDSL compiler
Java applicatie(Java, JSF, Hibernate)
![Page 59: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/59.jpg)
valkuilen
![Page 60: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/60.jpg)
entity User { username :: String password :: Secret}
entity Update { user -> User date :: DateTime text :: Text}
![Page 61: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/61.jpg)
entity User { username :: String password :: Secret}
entity Update { user -> User date :: DateTime text :: Text}
define page home() { for(u : Update) { output(u.user.username) ": " output(u.text) spacer }}
![Page 62: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/62.jpg)
entity User { username :: String password :: Secret}
entity Update { user -> User date :: DateTime text :: Text}
define page home() { for(u : Update) { output(u.user.username) ": " output(u.text) spacer }}
![Page 63: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/63.jpg)
define page home() { header{ "Twitr" } spacer for(u : Update) { output(u.user.username) ": " output(u.text) spacer } "(C) Zef Hemel"}
![Page 64: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/64.jpg)
define page login() { header{ "Twitr" } spacer var u : User
form { "Login: " input(u) action("Login", login())
action login() { session.user := u; return home(); } } spacer "(C) Zef Hemel"}
![Page 65: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/65.jpg)
define page login() { header{ "Twitr" } spacer var u : User
form { "Login: " input(u) action("Login", login())
action login() { session.user := u; return home(); } } spacer "(C) Zef Hemel"}
![Page 66: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/66.jpg)
template abstractie!
![Page 67: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/67.jpg)
define template main() { header{ "Twitr" } spacer body() "(C) Zef Hemel"}
define page home() { main() define body() { for(u : Update) { output(u.user.username) ": " output(u.text) spacer } }}
![Page 68: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/68.jpg)
WebDSL code
WebDSL compiler
Template expander
Java applicatie(Java, JSF, Hibernate)
![Page 69: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/69.jpg)
template expanderdefine page home() { main() define body() for(u : Update) { output(u.user.username) ": " output(u.text) spacer } }}
define page home() { header{ "Twitr" } spacer for(u : Update) { output(u.user.username) ": " output(u.text) spacer } "(C) Zef Hemel"}
![Page 70: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/70.jpg)
maar...
JSF had ook al templates
![Page 71: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/71.jpg)
WebDSL code
WebDSL compiler
Template expander
Java applicatie(Java, JSF, Hibernate)templates
![Page 72: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/72.jpg)
WebDSL code
WebDSL compiler
Template expander
Java applicatie(Java, JSF, Hibernate)templates
templates
![Page 73: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/73.jpg)
WebDSL code
WebDSL compiler
Template expander
Java applicatie(Java, JSF, Hibernate)templates
templates
herimplementeerttemplates
![Page 74: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/74.jpg)
abstraction inversion
WebDSL code
WebDSL compiler
Template expander
Java applicatie(Java, JSF, Hibernate)templates
templates
herimplementeerttemplates
![Page 75: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/75.jpg)
abstraction inversion
WebDSL code
WebDSL compiler
Template expander
Java applicatie(Java, JSF, Hibernate)templates
templates
herimplementeerttemplates
slechte abstractie
![Page 76: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/76.jpg)
![Page 77: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/77.jpg)
“All non-trivial abstractions, to some
degree, are leaky.”
-- Joel Spolsky
![Page 78: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/78.jpg)
abstracties verbergen implementatie
![Page 79: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/79.jpg)
abstracties verbergen implementatie
dat lukt eigenlijk nooit volledig
![Page 80: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/80.jpg)
abstracties verbergen implementatie
dat lukt eigenlijk nooit volledig
WebDSL templates
![Page 81: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/81.jpg)
abstracties verbergen implementatie
dat lukt eigenlijk nooit volledig
WebDSL templatesNFS/SMB
![Page 82: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/82.jpg)
abstracties verbergen implementatie
dat lukt eigenlijk nooit volledig
WebDSL templatesNFS/SMBtwee-dimensionale arrays
![Page 83: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/83.jpg)
abstracties verbergen implementatie
dat lukt eigenlijk nooit volledig
WebDSL templatesNFS/SMBtwee-dimensionale arraysSQL
![Page 84: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/84.jpg)
conclusie
![Page 85: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/85.jpg)
abstractie is essentieel
![Page 86: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/86.jpg)
abstractie is essentieelmoeilijk
![Page 87: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/87.jpg)
denk kritisch na
![Page 88: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/88.jpg)
denk kritisch na
heb ik dit vaker gedaan?
![Page 89: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/89.jpg)
denk kritisch na
heb ik dit vaker gedaan?gaat iemand dit vaker doen?
![Page 90: Abstractie (Dutch)](https://reader034.vdocuments.site/reader034/viewer/2022051412/548290ea5806b5e3048b46b8/html5/thumbnails/90.jpg)
ja?
abstraheer