fork download
  1. "======================================================================
  2.  Class: Book
  3.  ======================================================================"
  4. Object subclass: Book [
  5. | title author isBorrowed |
  6.  
  7. "クラスメソッド: インスタンス生成用"
  8. Book class >> title: aTitle author: anAuthor [
  9. ^self new setTitle: aTitle author: anAuthor
  10. ]
  11.  
  12. setTitle: aTitle author: anAuthor [
  13. title := aTitle.
  14. author := anAuthor.
  15. isBorrowed := false.
  16. ]
  17.  
  18. "ゲッター / セッター"
  19. title [ ^title ]
  20. author [ ^author ]
  21. isBorrowed [ ^isBorrowed ]
  22. isBorrowed: aBoolean [ isBorrowed := aBoolean ]
  23.  
  24. "文字列表現"
  25. asString [
  26. ^title , ' (by ' , author , ')' , (isBorrowed ifTrue: [ ' [貸出中]' ] ifFalse: [ ' [貸出可能]' ])
  27. ]
  28. ]
  29.  
  30. "======================================================================
  31.  Class: User
  32.  ======================================================================"
  33. Object subclass: User [
  34. | name borrowedBooks maxBooks |
  35.  
  36. "クラスメソッド: インスタンス生成用"
  37. User class >> name: aName maxBooks: aLimit [
  38. ^self new setName: aName maxBooks: aLimit
  39. ]
  40.  
  41. setName: aName maxBooks: aLimit [
  42. name := aName.
  43. maxBooks := aLimit.
  44. borrowedBooks := OrderedCollection new.
  45. ]
  46.  
  47. "ゲッター"
  48. name [ ^name ]
  49. borrowedBooks [ ^borrowedBooks ]
  50.  
  51. "ビジネスロジック: まだ借りられるか判定"
  52. canBorrowMore [
  53. ^borrowedBooks size < maxBooks
  54. ]
  55.  
  56. borrowBook: aBook [
  57. borrowedBooks add: aBook.
  58. ]
  59.  
  60. returnBook: aBook [
  61. borrowedBooks remove: aBook ifAbsent: [].
  62. ]
  63. ]
  64.  
  65. "======================================================================
  66.  Class: Library
  67.  ======================================================================"
  68. Object subclass: Library [
  69. | books users |
  70.  
  71. "クラスメソッド: 初期化を伴うインスタンス作成"
  72. Library class >> new [
  73. ^super new initialize
  74. ]
  75.  
  76. initialize [
  77. books := OrderedCollection new.
  78. users := OrderedCollection new.
  79. ]
  80.  
  81. "管理リストへの追加"
  82. addBook: aBook [ books add: aBook ]
  83. addUser: aUser [ users add: aUser ]
  84.  
  85. "貸出メソッド"
  86. checkoutBook: aBook forUser: aUser [
  87. "バリデーション"
  88. (books includes: aBook) ifFalse: [
  89. '【エラー】この本は図書館に登録されていません。' printNl. ^false
  90. ].
  91. (users includes: aUser) ifFalse: [
  92. '【エラー】この利用者は登録されていません。' printNl. ^false
  93. ].
  94. aBook isBorrowed ifTrue: [
  95. ('【エラー】「' , aBook title , '」はすでに貸出中です。') printNl. ^false
  96. ].
  97. aUser canBorrowMore ifFalse: [
  98. ('【エラー】' , aUser name , ' 様は貸出上限(制限数に達しています)を超えています。') printNl. ^false
  99. ].
  100.  
  101. "貸出の実行(状態変更)"
  102. aBook isBorrowed: true.
  103. aUser borrowBook: aBook.
  104. (aUser name , ' 様が「' , aBook title , '」を借りました。') printNl.
  105. ^true
  106. ]
  107.  
  108. "返却メソッド"
  109. returnBook: aBook fromUser: aUser [
  110. (aUser borrowedBooks includes: aBook) ifFalse: [
  111. ('【エラー】' , aUser name , ' 様はこの本を借りていません。') printNl. ^false
  112. ].
  113.  
  114. "返却の実行(状態変更)"
  115. aBook isBorrowed: false.
  116. aUser returnBook: aBook.
  117. (aUser name , ' 様が「' , aBook title , '」を返却しました。') printNl.
  118. ^true
  119. ]
  120.  
  121. "現在のステータス表示"
  122. printStatus [
  123. '---------------------------------------' printNl.
  124. '【図書館ステータス】' printNl.
  125. '■ 蔵書一覧:' printNl.
  126. books do: [ :each | (' - ' , each asString) printNl ].
  127. '■ 利用者一覧:' printNl.
  128. users do: [ :each |
  129. (' - ' , each name , ' (貸出中: ' , each borrowedBooks size printString , '冊)') printNl.
  130. ].
  131. '---------------------------------------' printNl.
  132. ]
  133. ]
  134.  
  135. "======================================================================
  136.  テストスクリプトの実行(メインルーチン)
  137.  ======================================================================"
  138. | myLibrary book1 book2 book3 student prof |
  139.  
  140. "1. 図書館の作成"
  141. myLibrary := Library new.
  142.  
  143. "2. 本の登録"
  144. book1 := Book title: 'Smalltalk-80 Blue Book' author: 'Adele Goldberg'.
  145. book2 := Book title: 'Design Patterns' author: 'GoF'.
  146. book3 := Book title: 'Squeak by Example' author: 'Stephane Ducasse'.
  147.  
  148. myLibrary addBook: book1; addBook: book2; addBook: book3.
  149.  
  150. "3. ユーザーの登録(学生は上限2冊、教授は上限5冊)"
  151. student := User name: '山田太郎(学生)' maxBooks: 2.
  152. prof := User name: 'スミス教授' maxBooks: 5.
  153.  
  154. myLibrary addUser: student; addUser: prof.
  155.  
  156. "--- 初期状態の出力 ---"
  157. myLibrary printStatus.
  158.  
  159. "--- 貸出シミュレーション ---"
  160. '>>> シナリオ1: 山田さんが2冊借りる' printNl.
  161. myLibrary checkoutBook: book1 forUser: student.
  162. myLibrary checkoutBook: book2 forUser: student.
  163.  
  164. '>>> シナリオ2: 山田さんが3冊目を借りようとする(上限エラーになるはず)' printNl.
  165. myLibrary checkoutBook: book3 forUser: student.
  166.  
  167. '>>> シナリオ3: スミス教授が山田さんの借りている本を借りようとする(貸出中エラーになるはず)' printNl.
  168. myLibrary checkoutBook: book1 forUser: prof.
  169.  
  170. '>>> シナリオ4: スミス教授が空いている本を借りる(成功するはず)' printNl.
  171. myLibrary checkoutBook: book3 forUser: prof.
  172.  
  173. myLibrary printStatus.
  174.  
  175. '>>> シナリオ5: 山田さんが1冊返却し、再度別の人に貸し出せるようにする' printNl.
  176. myLibrary returnBook: book1 fromUser: student.
  177.  
  178. myLibrary printStatus.
Success #stdin #stdout 0.01s 9380KB
stdin
Standard input is empty
stdout
'---------------------------------------'
'【図書館ステータス】'
'■ 蔵書一覧:'
'  - Smalltalk-80 Blue Book (by Adele Goldberg) [貸出可能]'
'  - Design Patterns (by GoF) [貸出可能]'
'  - Squeak by Example (by Stephane Ducasse) [貸出可能]'
'■ 利用者一覧:'
'  - 山田太郎(学生) (貸出中: 0冊)'
'  - スミス教授 (貸出中: 0冊)'
'---------------------------------------'
'>>> シナリオ1: 山田さんが2冊借りる'
'山田太郎(学生) 様が「Smalltalk-80 Blue Book」を借りました。'
'山田太郎(学生) 様が「Design Patterns」を借りました。'
'>>> シナリオ2: 山田さんが3冊目を借りようとする(上限エラーになるはず)'
'【エラー】山田太郎(学生) 様は貸出上限(制限数に達しています)を超えています。'
'>>> シナリオ3: スミス教授が山田さんの借りている本を借りようとする(貸出中エラーになるはず)'
'【エラー】「Smalltalk-80 Blue Book」はすでに貸出中です。'
'>>> シナリオ4: スミス教授が空いている本を借りる(成功するはず)'
'スミス教授 様が「Squeak by Example」を借りました。'
'---------------------------------------'
'【図書館ステータス】'
'■ 蔵書一覧:'
'  - Smalltalk-80 Blue Book (by Adele Goldberg) [貸出中]'
'  - Design Patterns (by GoF) [貸出中]'
'  - Squeak by Example (by Stephane Ducasse) [貸出中]'
'■ 利用者一覧:'
'  - 山田太郎(学生) (貸出中: 2冊)'
'  - スミス教授 (貸出中: 1冊)'
'---------------------------------------'
'>>> シナリオ5: 山田さんが1冊返却し、再度別の人に貸し出せるようにする'
'山田太郎(学生) 様が「Smalltalk-80 Blue Book」を返却しました。'
'---------------------------------------'
'【図書館ステータス】'
'■ 蔵書一覧:'
'  - Smalltalk-80 Blue Book (by Adele Goldberg) [貸出可能]'
'  - Design Patterns (by GoF) [貸出中]'
'  - Squeak by Example (by Stephane Ducasse) [貸出中]'
'■ 利用者一覧:'
'  - 山田太郎(学生) (貸出中: 1冊)'
'  - スミス教授 (貸出中: 1冊)'
'---------------------------------------'