From: "Steve P." Date: 2010-07-31T09:06:21+09:00 Subject: Re: Beginner help needed: use a class def to create new instance Jes��s Gabriel y Gal��n, I was able to accomplish (at least crudely) moving code from the main body to the class. I felt this was worth doing because I want as much logic as possible in the class. (Is this a worthy thing??) As you advised, I was able to create my new instance using a method that returned an object. Could you please take a look at how I implemented these two methods? Account.setupaccount, Account.report Is this how you would have structured it? Any tips or comments greatly appreciated. Steve. #!/usr/bin/ruby class Account attr_reader :nbr, :name, :coa def initialize(nbr,name,coa) @nbr=nbr @name=name setcoa(coa) end def setcoa(coa) if ["income", "expense", "asset", "liability", "capital"].include?(coa) then @coa=coa else puts "Error, defaulted to expense" @coa="expense" end end def Account.setupaccount #data entry routine inside class, not in main code body. print "enter acct nbr: ";nbr=gets.chomp print "enter name: ";name=gets.chomp print "enter presen: ";coa=gets.chomp return Account.new(nbr,name,coa) end def Account.report(acct) #reporting code inside class, not in main body. puts "===Account Number Listing===" puts "Account Nbr: #{acct.nbr}" puts "Account Name: #{acct.name}" puts "Account CofA: #{acct.coa}" end end ##Start of main code body ## newacct=Account.setupaccount Account.report(newacct) ##End of Main code body ## When I clear my confusion about this, I will do something like class Ledger < Account ##code to make an array of the Account objects and add more functionality end Jes��s Gabriel y Gal��n wrote: > On Tue, Jul 27, 2010 at 6:36 AM, Steve P. > wrote: >> PS: I realize I can instantiate newchar=Character.new(da da da) from the >> body of the code but that would require the prompting code be there >> also. that would defeat my purpose. I hope I have given this enough >> thought before posting! :-) > > Two considerations: > > - I tend to separate the domain objects from the code that interacts > with the outside world to gather the data to populate that domain > object (user typing, DB, etc). This way you gain flexibility, being > able to add ways of loading or creating the object without modifying > that class > > - If, in any case, you want the interaction with the user in that > class, I would use a class method that returns an instance. If you > have other ways of creating that instance you can add new methods for > each case. For example: > > > #!/usr/bin/ruby -w > > class Character > attr_reader :chname, :chnick, :chquote > def initialize(chname,chnick) > ��� @chname=chname > ��� ��� @chnick=chnick > ��� ��� @chquote=String.new > end > ��� def addquote(quote) > ��� @chquote=quote if quote.length > 10 > ��� end > ��� def self.from_prompted_input > ��� ��� print "Char name: ��� ���";chname=gets.chomp > ��� ��� print "Char Nick: ��� ���";chnick=gets.chomp > ��� ��� print "Char Quote: ��� ��� ��� ��� ���";chquote=gets.chomp > Character.new chname, chnick,chquote > end > end > > puts Character.from_prompted_input.inspect > > What you had in mind couldn't work, because your method was an > instance method, so from the outside you still needed someone to call > Character.new(x,y,z).promptedinput. > > Having class methods to instantiate objects of the class in different > ways is a pretty typical idiom, check for example the Date class in > core: > > http://ruby-doc.org/core/classes/Date.html > > The methods civil, commercial, etc are class methods that return an > instance, constructed in a different way. > > Jesus. -- Posted via http://www.ruby-forum.com/.