first class state change in
play

First-Class State Change in Karl Naden with Joshua - PowerPoint PPT Presentation

First-Class State Change in Karl Naden with Joshua Sunshine, Sven Stork Jonathan Aldrich, and ric Tanter OOPSLA 10/27/2011 School of Computer


  1. First-­‑Class ¡State ¡Change ¡in ¡ Karl ¡Naden ¡ with ¡Joshua ¡Sunshine, ¡Sven ¡Stork ¡ Jonathan ¡Aldrich, ¡and ¡Éric ¡Tanter ¡ OOPSLA ¡10/27/2011 ¡ ¡ School ¡of ¡Computer ¡Science ¡

  2. States ¡and ¡State ¡Change ¡ • Things ¡all ¡around ¡us ¡are ¡changing ¡state ¡ • BuBerfly: ¡Egg ¡  ¡Caterpillar ¡  ¡Chrysalis ¡  ¡Imago ¡ 1

  3. States ¡and ¡State ¡Change ¡ • Things ¡all ¡around ¡us ¡are ¡changing ¡state ¡ • BuBerfly: ¡Egg ¡  ¡Caterpillar ¡  ¡Chrysalis ¡  ¡Imago ¡ • You: ¡Awake ¡  ¡Asleep ¡ 1

  4. States ¡and ¡State ¡Change ¡ • Things ¡all ¡around ¡us ¡are ¡changing ¡state ¡ • BuBerfly: ¡Egg ¡  ¡Caterpillar ¡  ¡Chrysalis ¡  ¡Imago ¡ • You: ¡Awake ¡  ¡Asleep ¡ • In ¡Programming, ¡too ¡ • File: ¡Open ¡  ¡Closed ¡ 1

  5. States ¡and ¡State ¡Change ¡ • Things ¡all ¡around ¡us ¡are ¡changing ¡state ¡ • BuBerfly: ¡Egg ¡  ¡Caterpillar ¡  ¡Chrysalis ¡  ¡Imago ¡ • You: ¡Awake ¡  ¡Asleep ¡ • In ¡Programming, ¡too ¡ • File: ¡Open ¡  ¡Closed ¡ • Java ¡ExcepNon: ¡Cause ¡Not ¡Set ¡  ¡Cause ¡Set ¡ 1

  6. States ¡and ¡State ¡Change ¡ • Things ¡all ¡around ¡us ¡are ¡changing ¡state ¡ • BuBerfly: ¡Egg ¡  ¡Caterpillar ¡  ¡Chrysalis ¡  ¡Imago ¡ • You: ¡Awake ¡  ¡Asleep ¡ • In ¡Programming, ¡too ¡ • File: ¡Open ¡  ¡Closed ¡ • Java ¡ExcepNon: ¡Cause ¡Not ¡Set ¡  ¡Cause ¡Set ¡ • Different ¡abiliNes ¡depending ¡on ¡the ¡state ¡ • BuBerfly ¡can ¡only ¡fly ¡as ¡an ¡Imago ¡ • read() ¡only ¡available ¡in ¡the ¡Open ¡state ¡of ¡File ¡ 1

  7. States ¡and ¡State ¡Change ¡ • Things ¡all ¡around ¡us ¡are ¡changing ¡state ¡ • BuBerfly: ¡Egg ¡  ¡Caterpillar ¡  ¡Chrysalis ¡  ¡Imago ¡ • You: ¡Awake ¡  ¡Asleep ¡ • In ¡Programming, ¡too ¡ • File: ¡Open ¡  ¡Closed ¡ • Java ¡ExcepNon: ¡Cause ¡Not ¡Set ¡  ¡Cause ¡Set ¡ • Different ¡abiliNes ¡depending ¡on ¡the ¡state ¡ • BuBerfly ¡can ¡only ¡fly ¡as ¡an ¡Imago ¡ • read() ¡only ¡available ¡in ¡the ¡Open ¡state ¡of ¡File ¡ • Error ¡when ¡the ¡current ¡state ¡does ¡not ¡support ¡the ¡acNon ¡ 1

  8. Describing ¡Objects ¡with ¡State ¡ ¡ 2

  9. Describing ¡Objects ¡with ¡State ¡ • An ¡ Object ¡Protocol ¡ [Strom, Yemini ’86] ¡ dictates ¡an ¡ order ¡ on ¡ method ¡calls : ¡ • Has ¡a ¡ finite ¡number ¡of ¡ abstract ¡states ¡ in ¡which ¡different ¡ method ¡calls ¡are ¡valid; ¡ • Specifies ¡ transi@ons ¡ between ¡abstract ¡states ¡that ¡occur ¡as ¡ a ¡part ¡of ¡some ¡method ¡calls. ¡ ¡ 2

  10. Describing ¡Objects ¡with ¡State ¡ • An ¡ Object ¡Protocol ¡ [Strom, Yemini ’86] ¡ dictates ¡an ¡ order ¡ on ¡ method ¡calls : ¡ • Has ¡a ¡ finite ¡number ¡of ¡ abstract ¡states ¡ in ¡which ¡different ¡ method ¡calls ¡are ¡valid; ¡ • Specifies ¡ transi@ons ¡ between ¡abstract ¡states ¡that ¡occur ¡as ¡ a ¡part ¡of ¡some ¡method ¡calls. ¡ • State ¡Charts ¡ [Harel ’87] : File ¡ • States: ¡File, ¡Open, ¡Closed ¡ • Methods: ¡read(), ¡open(), ¡ ¡ ¡ ¡ ¡ ¡closed() ¡ • TransiNons: ¡close(), ¡open() ¡ ¡ 2

  11. Exis@ng ¡Support ¡for ¡States ¡ ¡ 3

  12. Exis@ng ¡Support ¡for ¡States ¡ • States ¡exists ¡ • In ¡documentaNon ¡ /** @throws IllegalStateException if task was already scheduled or * cancelled , timer was cancelled , or timer thread terminated. */ ¡ private void sched(TimerTask task, long time, long period) { … } 3

  13. Exis@ng ¡Support ¡for ¡States ¡ • States ¡exists ¡ • In ¡documentaNon ¡ /** @throws IllegalStateException if task was already scheduled or * cancelled , timer was cancelled , or timer thread terminated. */ ¡ private void sched(TimerTask task, long time, long period) { … } • Encoded ¡as ¡lower-­‑level ¡constructs ¡ if (task. state != TimerTask.VIRGIN) throw new IllegalStateException (…); 3

  14. Exis@ng ¡Support ¡for ¡States ¡ • States ¡exists ¡ • In ¡documentaNon ¡ /** @throws IllegalStateException if task was already scheduled or * cancelled , timer was cancelled , or timer thread terminated. */ ¡ private void sched(TimerTask task, long time, long period) { … } • Encoded ¡as ¡lower-­‑level ¡constructs ¡ if (task. state != TimerTask.VIRGIN) throw new IllegalStateException (…); • Problems ¡ • States ¡from ¡design ¡are ¡obfuscated ¡ • Code ¡difficult ¡to ¡understand ¡ • If ¡checks ¡forgoBen, ¡results ¡difficult ¡to ¡debug, ¡e.g. ¡ ¡ • Non-­‑specific ¡ NullPointerExcep@on ¡ • Data ¡corrupNon ¡(overwriBen ¡ TimerTask ) ¡ 3

  15. Common ¡and ¡Complex ¡ ¡ 4

  16. Common ¡and ¡Complex ¡ • Common ¡ [Beckman ¡‘11] ¡ • 7% ¡of ¡Java ¡classes ¡define ¡object ¡protocols ¡ • 3x ¡as ¡many ¡as ¡define ¡generics ¡ • 13% ¡use ¡them ¡ ¡ 4

  17. Common ¡and ¡Complex ¡ • Common ¡ [Beckman ¡‘11] ¡ • 7% ¡of ¡Java ¡classes ¡define ¡object ¡protocols ¡ • 3x ¡as ¡many ¡as ¡define ¡generics ¡ • 13% ¡use ¡them ¡ • Complex: ¡ ¡ ¡ 4

  18. Overview ¡ • ¡ ¡ ¡ ¡programming ¡language ¡ – First ¡class ¡states ¡and ¡transiNons ¡ 5

  19. Overview ¡ • ¡ ¡ ¡ ¡programming ¡language ¡ – First ¡class ¡states ¡and ¡transiNons ¡ • Overview ¡ – Syntax ¡and ¡semanNcs ¡of ¡states ¡and ¡ transiNons ¡ – Trait-­‑based ¡reuse ¡ 5

  20. Two ¡Encodings ¡of ¡File ¡ 6

  21. Two ¡Encodings ¡of ¡File ¡ 1) States class File { private FileResource filePtr = null; } ¡ 6

  22. Two ¡Encodings ¡of ¡File ¡ 1) States class File { private FileResource filePtr = null; substate of file determined by null -ness of filePtr field } ¡ 6

  23. Two ¡Encodings ¡of ¡File ¡ 1) States state ¡File ¡{ ¡ ¡ } ¡ ¡ class File { state ¡Open ¡ case ¡of ¡File ¡{ ¡ ¡ private FileResource filePtr = null; ¡ ¡ } ¡ ¡ state ¡Closed ¡ case ¡of ¡File ¡{ ¡ ¡ ¡ ¡ } ¡ } ¡ 6

  24. Two ¡Encodings ¡of ¡File ¡ 2) Methods state ¡File ¡{ ¡ ¡ ¡ ¡ } ¡ ¡ class File { state ¡Open ¡ case ¡of ¡File ¡{ ¡ ¡ ¡ ¡ private FileResource filePtr = null; ¡ pubic int read() {…} ¡ } ¡ ¡ state ¡Closed ¡ case ¡of ¡File ¡{ ¡ ¡ ¡ ¡ public void close() {…} ¡ ¡ ¡ public void open() {…} ¡ ¡ ¡ } ¡ } ¡ 6

  25. Two ¡Encodings ¡of ¡File ¡ 2) Methods state ¡File ¡{ ¡ ¡ ¡ ¡ } ¡ ¡ class File { state ¡Open ¡ case ¡of ¡File ¡{ ¡ ¡ ¡ ¡ private FileResource filePtr = null; ¡ ¡ method ¡read() ¡{…} ¡ pubic int read() {…} ¡ ¡ method ¡close() ¡{…} ¡ } ¡ ¡ state ¡Closed ¡ case ¡of ¡File ¡{ ¡ ¡ ¡ method ¡open() ¡{…} ¡ public void close() {…} ¡ ¡ ¡ public void open() {…} ¡ ¡ ¡ } ¡ } ¡ 6

  26. Two ¡Encodings ¡of ¡File ¡ 2) Methods state ¡File ¡{ ¡ ¡ ¡ ¡ } ¡ ¡ class File { state ¡Open ¡ case ¡of ¡File ¡{ ¡ ¡ ¡ ¡ private FileResource filePtr = null; ¡ ¡ method ¡read() ¡{…} ¡ pubic int read() { ¡ ¡ method ¡close() ¡{…} ¡ if (filePtr == null) } ¡ throw new IOException ¡ else … state ¡Closed ¡ case ¡of ¡File ¡{ ¡ } ¡ ¡ method ¡open() ¡{…} ¡ public void close() {…} ¡ public void open() ¡ { if (filePtr == null) {…} } } ¡ } ¡ 6

  27. Two ¡Encodings ¡of ¡File ¡ 3) Representation state ¡File ¡{ ¡ ¡ ¡ val ¡filename; ¡ } ¡ ¡ class File { state ¡Open ¡ case ¡of ¡File ¡{ ¡ private String filename; ¡ ¡val ¡filePtr; ¡ private FileResource filePtr = null; ¡ ¡ method ¡read() ¡{…} ¡ pubic int read() { ¡ ¡ method ¡close() ¡{…} ¡ if (filePtr == null) } ¡ throw new IOException ¡ else … state ¡Closed ¡ case ¡of ¡File ¡{ ¡ } ¡ ¡ method ¡open() ¡{…} ¡ public void close() {…} ¡ public void open() ¡ { if (filePtr == null) {…} } } ¡ } ¡ 6

Recommend


More recommend