From ccfe458b09dd900c12b0421f19abdf9887d5b912 Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 26 May 2011 14:11:46 +0200 Subject: more bank example app: - add persistent store - implement ranges --- .gitignore | 1 + bank-eiffel/account.e | 8 +- bank-eiffel/bank.e | 206 +++++++++++++++++++++++++++++++++++++++-------- bank-eiffel/bank_store.e | 48 +++++++++++ 4 files changed, 226 insertions(+), 37 deletions(-) create mode 100644 bank-eiffel/bank_store.e diff --git a/.gitignore b/.gitignore index b1bee25..0df8baa 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ pacman-c++/*.pb.cc *-build-desktop .*.swp bank-eiffel/EIFGENs +bank-eiffel/bank.data diff --git a/bank-eiffel/account.e b/bank-eiffel/account.e index 7c127ec..fe9cc3b 100644 --- a/bank-eiffel/account.e +++ b/bank-eiffel/account.e @@ -23,13 +23,15 @@ feature -- Access feature {NONE} -- Implementation - creditline_range: TUPLE [min: like creditline; max: like creditline] + range: detachable TUPLE [min: REAL_64; max: REAL_64] + + creditline_range: attached like range -- min/max for creditline - interest_deposit_range: TUPLE [min: like interest_deposit; max: like interest_deposit] + interest_deposit_range: attached like range -- min/max for interest_deposit - interest_debit_range: TUPLE [min: like interest_debit; max: like interest_debit] + interest_debit_range: attached like range -- min/max for interest_debit authorized_signers: ARRAYED_SET [PERSON] diff --git a/bank-eiffel/bank.e b/bank-eiffel/bank.e index 1f61c6e..f9390c7 100644 --- a/bank-eiffel/bank.e +++ b/bank-eiffel/bank.e @@ -6,24 +6,46 @@ create feature {NONE} -- Implementation - persons: ARRAYED_SET [PERSON] - -- Kunden - - accounts: ARRAYED_SET [ACCOUNT] - -- Vorname + store: BANK_STORE over: BOOLEAN last_error: STRING + data_file: RAW_FILE + + data_filename: STRING = "bank.data" + feature {NONE} -- Initialization run do - create persons.make(100) - create accounts.make(100) + create store.make(100) + store.ranges.account.creditline := [-1000.0, 0.0] + store.ranges.account.interest_deposit := [0.01, 0.04] + store.ranges.account.interest_debit := [0.02, 0.1] + store.ranges.studentaccount.creditline := [-300.0, 0.0] + store.ranges.studentaccount.interest_deposit := [0.02, 0.03] + store.ranges.studentaccount.interest_debit := [0.03, 0.06] + store.ranges.retireeaccount.creditline := [-300.0, 0.0] + store.ranges.retireeaccount.interest_deposit := [0.02, 0.03] + store.ranges.retireeaccount.interest_debit := [0.03, 0.06] create last_error.make_empty + + create data_file.make (data_filename) + if data_file.exists then + data_file.open_read + store ?= store.retrieved (data_file) + data_file.close + end + session + + if data_file.is_creatable then + data_file.open_write + store.independent_store (data_file) + data_file.close + end end feature -- Basic operations @@ -66,8 +88,9 @@ feature -- Basic operations do print_header print ("Operations:%N") - print (" p ...list/create/edit persons%N") - print (" a ...list/create/edit accounts%N") + print (" r ...list/edit global ranges%N") + print (" p ...list/create/edit/delete persons%N") + print (" a ...list/create/edit/delete accounts%N") print (" q ...quit%N") print ("%N") print_last_error @@ -76,6 +99,8 @@ feature -- Basic operations io.next_line inspect io.last_character.lower + when 'r' then + ranges_screen when 'p' then persons_screen when 'a' then @@ -88,6 +113,92 @@ feature -- Basic operations print ("%N%N") end + ranges_screen + local + back: BOOLEAN + do + from + until + back + loop + print_header + print ("Global Ranges:%N") + print (" Account:%N") + print_ranges(store.ranges.account) + print (" Student account:%N") + print_ranges(store.ranges.studentaccount) + print (" Retiree account:%N") + print_ranges(store.ranges.retireeaccount) + print ("%N") + print ("Operations:%N") + print (" a ...edit account ranges%N") + print (" s ...edit student account ranges%N") + print (" r ...edit retiree account ranges%N") + print (" b ...back%N") + print ("%N") + print_last_error + print ("Enter a command, followed by : ") + io.read_character + io.next_line + + inspect io.last_character + when 'a' then + edit_ranges("account", store.ranges.account) + when 's' then + edit_ranges("student account", store.ranges.studentaccount) + when 'r' then + edit_ranges("retiree account", store.ranges.retireeaccount) + when 'b' then + back := True + else + last_error := "Error: Unknown command '" + io.last_character.out + "'" + end + print ("%N%N") + end + end + + print_ranges(range: like {BANK_STORE}.account_range) + do + print (" - Creditline: " + print_range(range.creditline) + "%N") + print (" - Interest deposit: " + print_range(range.interest_deposit) + "%N") + print (" - Interest debit: " + print_range(range.interest_debit) + "%N") + end + + print_range(range: like {BANK_STORE}.range): STRING_8 + local + fd: FORMAT_DOUBLE + do + create fd.make(2, 2) + Result := "[" + fd.formatted(range.min) + ", " + fd.formatted(range.max) + "]" + end + + edit_ranges(type: STRING_8; range: like {BANK_STORE}.account_range) + do + print ("%N") + print ("Edit " + type + " range:%N") + edit_range("creditline", range.creditline) + edit_range("interest depost", range.interest_deposit) + edit_range("interest debit", range.interest_debit) + end + + edit_range(type: STRING_8; range: like {BANK_STORE}.range) + local + fd: FORMAT_DOUBLE + do + create fd.make(2, 2) + print ("Enter " + type + " minimum [" + fd.formatted(range.min) + "]: ") + io.readline + if io.last_string.is_double then + range.min := io.last_string.to_double + end + + print ("Enter " + type + " maximum [" + fd.formatted(range.max) + "]: ") + io.readline + if io.last_string.is_double then + range.max := io.last_string.to_double + end + end + persons_screen local back: BOOLEAN @@ -138,8 +249,9 @@ feature -- Basic operations print_header print ("Operations:%N") print (" l ...list accounts%N") - print (" c ...create accounts%N") - print (" e ...edit accounts%N") + print (" c ...create account%N") + print (" e ...edit account%N") + print (" d ...delete account%N") print (" b ...back%N") print ("%N") print_last_error @@ -149,8 +261,10 @@ feature -- Basic operations inspect io.last_character when 'l' then + list_accounts when 'c' then when 'e' then + when 'd' then when 'b' then back := True else @@ -163,20 +277,47 @@ feature -- Basic operations list_persons do print ("%N") - print ("Persons: " + persons.count.out + "%N%N") + print ("Persons: " + store.persons.count.out + "%N%N") from - persons.start + store.persons.start until - persons.off + store.persons.off loop - print ("#" + persons.index.out + " " + persons.item.surname + ", " + persons.item.firstname) - if attached {RETIREE} persons.item then + print ("#" + store.persons.index.out + " " + store.persons.item.surname + ", " + store.persons.item.firstname) + if attached {RETIREE} store.persons.item then print (" (RETIREE)") - elseif attached {STUDENT} persons.item then + elseif attached {STUDENT} store.persons.item then print (" (STUDENT)") end print ("%N") - persons.forth + store.persons.forth + end + + print ("%N") + print ("Press to go back") + io.read_line + end + + list_accounts + do + print ("%N") + print ("Accounts: " + store.accounts.count.out + "%N%N") + from + store.accounts.start + until + store.accounts.off + loop + --TODO + print ("#" + store.accounts.index.out + "%N") + print (" balance=" + store.accounts.item.balance.out + "%N") + print (" creditline=" + store.accounts.item.creditline.out + "%N") + if attached {RETIREEACCOUNT} store.accounts.item then + print (" (RETIREEACCOUNT)") + elseif attached {STUDENTACCOUNT} store.accounts.item then + print (" (STUDENTACCOUNT)") + end + print ("%N") + store.accounts.forth end print ("%N") @@ -218,14 +359,14 @@ feature -- Basic operations inspect io.last_character when 'p' then - persons.put(create {PERSON}.make(surname, firstname)) + store.persons.put(create {PERSON}.make(surname, firstname)) when 's' then - persons.put(create {STUDENT}.make(surname, firstname)) + store.persons.put(create {STUDENT}.make(surname, firstname)) when 'r' then - persons.put(create {RETIREE}.make(surname, firstname)) + store.persons.put(create {RETIREE}.make(surname, firstname)) else end - last_error := "Person (#" + persons.count.out + ") created successfully" + last_error := "Person (#" + store.persons.count.out + ") created successfully" back := True when 'b' then back := True @@ -242,27 +383,24 @@ feature -- Basic operations end edit_person - local - firstname: STRING - surname: STRING do print ("%N") print ("Enter person id (0 ...back): ") io.read_integer if io.last_integer > 0 then - if persons.valid_index (io.last_integer) then - persons.go_i_th (io.last_integer) + if store.persons.valid_index (io.last_integer) then + store.persons.go_i_th (io.last_integer) - print ("Enter surname [" + persons.item.surname + "]: ") + print ("Enter surname [" + store.persons.item.surname + "]: ") io.readline if not io.last_string.is_empty then - persons.item.surname := io.last_string.twin + store.persons.item.surname := io.last_string.twin end - print ("Enter firstname [" + persons.item.firstname + "]: ") + print ("Enter firstname [" + store.persons.item.firstname + "]: ") io.readline if not io.last_string.is_empty then - persons.item.firstname := io.last_string.twin + store.persons.item.firstname := io.last_string.twin end else last_error := "Invalid person id" @@ -276,9 +414,9 @@ feature -- Basic operations print ("Enter person id (0 ...back): ") io.read_integer if io.last_integer > 0 then - if persons.valid_index (io.last_integer) then - persons.go_i_th (io.last_integer) - persons.remove + if store.persons.valid_index (io.last_integer) then + store.persons.go_i_th (io.last_integer) + store.persons.remove last_error := "Person (#" + io.last_integer.out + ") removed successfully" else last_error := "Invalid person id" diff --git a/bank-eiffel/bank_store.e b/bank-eiffel/bank_store.e new file mode 100644 index 0000000..acc6f3a --- /dev/null +++ b/bank-eiffel/bank_store.e @@ -0,0 +1,48 @@ +class + BANK_STORE + +inherit + STORABLE + +create + make + +feature + + persons: ARRAYED_SET [PERSON] + + accounts: ARRAYED_SET [ACCOUNT] + + ranges: TUPLE [ + account: attached like account_range; + studentaccount: attached like account_range; + retireeaccount: attached like account_range + ] + +feature {NONE} -- Implementation + + account_range: detachable TUPLE [ + creditline: attached like range; + interest_deposit: attached like range; + interest_debit: attached like range + ] + + range: detachable like {ACCOUNT}.range + +feature {NONE} -- Initialization + + make(cap: INTEGER) + do + create persons.make(cap) + create accounts.make(cap) + create ranges + ranges.account := new_range + ranges.studentaccount := new_range + ranges.retireeaccount := new_range + end + + new_range: attached like account_range + do + create Result + end +end -- cgit v1.2.3