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 ¡
States ¡and ¡State ¡Change ¡ • Things ¡all ¡around ¡us ¡are ¡changing ¡state ¡ • BuBerfly: ¡Egg ¡ ¡Caterpillar ¡ ¡Chrysalis ¡ ¡Imago ¡ 1
States ¡and ¡State ¡Change ¡ • Things ¡all ¡around ¡us ¡are ¡changing ¡state ¡ • BuBerfly: ¡Egg ¡ ¡Caterpillar ¡ ¡Chrysalis ¡ ¡Imago ¡ • You: ¡Awake ¡ ¡Asleep ¡ 1
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
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
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
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
Describing ¡Objects ¡with ¡State ¡ ¡ 2
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
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
Exis@ng ¡Support ¡for ¡States ¡ ¡ 3
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
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
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
Common ¡and ¡Complex ¡ ¡ 4
Common ¡and ¡Complex ¡ • Common ¡ [Beckman ¡‘11] ¡ • 7% ¡of ¡Java ¡classes ¡define ¡object ¡protocols ¡ • 3x ¡as ¡many ¡as ¡define ¡generics ¡ • 13% ¡use ¡them ¡ ¡ 4
Common ¡and ¡Complex ¡ • Common ¡ [Beckman ¡‘11] ¡ • 7% ¡of ¡Java ¡classes ¡define ¡object ¡protocols ¡ • 3x ¡as ¡many ¡as ¡define ¡generics ¡ • 13% ¡use ¡them ¡ • Complex: ¡ ¡ ¡ 4
Overview ¡ • ¡ ¡ ¡ ¡programming ¡language ¡ – First ¡class ¡states ¡and ¡transiNons ¡ 5
Overview ¡ • ¡ ¡ ¡ ¡programming ¡language ¡ – First ¡class ¡states ¡and ¡transiNons ¡ • Overview ¡ – Syntax ¡and ¡semanNcs ¡of ¡states ¡and ¡ transiNons ¡ – Trait-‑based ¡reuse ¡ 5
Two ¡Encodings ¡of ¡File ¡ 6
Two ¡Encodings ¡of ¡File ¡ 1) States class File { private FileResource filePtr = null; } ¡ 6
Two ¡Encodings ¡of ¡File ¡ 1) States class File { private FileResource filePtr = null; substate of file determined by null -ness of filePtr field } ¡ 6
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
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
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
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
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