Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > modules and classes question

Reply
Thread Tools

modules and classes question

 
 
Marcelo Barbudas
Guest
Posts: n/a
 
      05-03-2009
Hi,

This is a serious noob question.

I am trying to write a small library and have the following situation:

class Main
//initializes connection

def request(blabla)
end
end

class Resource < Main
//different API calls
def call
//bla bla
request(call)
end
end

I would like to let the user do something like the AWS library:
Library::Main.initialize_connection(data) // initializes everything
and then just:
Library::Resource.method // and this should work

In Main I have the function that fills the data, I just don't know how
to implement the Resource class.

--
M.

 
Reply With Quote
 
 
 
 
7stud --
Guest
Posts: n/a
 
      05-03-2009
Marcelo Barbudas wrote:
> Hi,
>
> This is a serious noob question.
>
> I am trying to write a small library and have the following situation:
>
> class Main
> //initializes connection
>
> def request(blabla)
> end
> end
>
> class Resource < Main
> //different API calls
> def call
> //bla bla
> request(call)
> end
> end
>
> I would like to let the user do something like the AWS library:
> Library::Main.initialize_connection(data) // initializes everything
> and then just:
> Library::Resource.method // and this should work
>
> In Main I have the function that fills the data, I just don't know how
> to implement the Resource class.


I'm not sure what your issue is, so let's start with this:

module Library

class Main
def Main.initialize_stuff
puts "initializing"
end
end

class Resource
def Resource.meth
puts "executing meth"
end
end

end

Library::Main.initialize_stuff
Library::Resource.meth

--output:--
initializing
executing meth

Now what do you want to do?

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Marcelo Barbudas
Guest
Posts: n/a
 
      05-03-2009
Hi,
> I'm not sure what your issue is, so let's start with this:
>
> module Library
>
> class Main
> def Main.initialize_stuff
> puts "initializing"
> end
> end
>
> class Resource
> def Resource.meth
> puts "executing meth"
> end
> end
>
> end
>
>

Thanks for the answer.

Resource has to call a function from Main, or return an error if Main
isn't initialized.

I made Resource a subclass of Main because I wanted it to be the main
connection class.

--
M.



 
Reply With Quote
 
7stud --
Guest
Posts: n/a
 
      05-03-2009
Marcelo Barbudas wrote:
> Hi,
>> class Resource
>> def Resource.meth
>> puts "executing meth"
>> end
>> end
>>
>> end
>>
>>

> Thanks for the answer.
>
> Resource has to call a function from Main, or return an error if Main
> isn't initialized.
>
> I made Resource a subclass of Main because I wanted it to be the main
> connection class.


The next iteration of the code:

module Library

class Main
@@ready_to_go = false

def Main.initialize
puts "initializing"
@@ready_to_go = true
end

def Main.do_stuff
if not @@ready_to_go
raise "error"
else
puts "doing stuff"
end
end

end

class Resource
def Resource.meth
Main.do_stuff
end
end

end

Library::Main.initialize
Library::Resource.meth

--output:--
initializing
doing stuff

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Marcelo Barbudas
Guest
Posts: n/a
 
      05-03-2009
Hi.
> The next iteration of the code:
>

This looks like just what I want. I'll try it and re-open the thread if
I get stuck again.


Thanks!

--
M.

 
Reply With Quote
 
7stud --
Guest
Posts: n/a
 
      05-03-2009
7stud -- wrote:
>


Another iteration. Try this:

module Library

class BaseResource
@@ready_to_go = false

def BaseResource.initialize
puts "initializing"
@@ready_to_go = true
end

def do_stuff
if not @@ready_to_go
raise "error"
else
puts "doing stuff"
end
end

end

class SpecializedResource < BaseResource
def SpecializedResource.meth
do_stuff
end
end

end

Library::BaseResource.initialize
Library::SpecializedResource.meth


That doesn't work. When you write a method call without an object in
front of it:

class SpecializedResource < BaseResource
def SpecializedResource.meth
do_stuff #<-------****
end
end

the implicit caller is self. Inside meth, self is equal to the object
that called meth. The object that called meth can be seen in this line:

Library::SpecializedResource.meth

It's the class Library::SpecializedResource. So inside meth, self is
equal to the Library::SpecializedResource class. And the
Library:SpecializedResource class does not have a method named
do_stuff--only instances of that class have a method named
do_stuff(which is inherited from BaseResource). To call the instance
method, you need an instance. So you can do something like this:

class SpecializedResource < BaseResource
def SpecializedResource.meth
sr = SpecializedResource.new
sr.do_stuff
end
end



--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
matt neuburg
Guest
Posts: n/a
 
      05-03-2009
7stud -- <(E-Mail Removed)> wrote:

> When you write a method call without an object in
> front of it:
>
> class SpecializedResource < BaseResource
> def SpecializedResource.meth
> do_stuff #<-------****
> end
> end
>
> Inside meth, self is equal to the object
> that called meth.


Inside meth, self is equal to the object that meth is inside when it is
called. It has nothing whatever to do with who *calls* meth. m.

--
matt neuburg, phd = http://www.velocityreviews.com/forums/(E-Mail Removed), http://www.tidbits.com/matt/
Leopard - http://www.takecontrolbooks.com/leop...stomizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com
 
Reply With Quote
 
Marcelo Barbudas
Guest
Posts: n/a
 
      05-04-2009
Hi,
> class SpecializedResource < BaseResource
> def SpecializedResource.meth
> sr = SpecializedResource.new
> sr.do_stuff
> end
> end


This seems a little complicated, not very DRY to write this code for
every method.

How does AWS do it?

AWS::S3::Base.establish_connection!()
and then just:
Bucket.create('jukebox')

--
M.


 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      05-05-2009
2009/5/4 Marcelo Barbudas <(E-Mail Removed)>:
> Hi,
>>
>> =A0class SpecializedResource < BaseResource
>> =A0 =A0def SpecializedResource.meth
>> =A0 =A0 =A0sr =3D SpecializedResource.new
>> =A0 =A0 =A0sr.do_stuff
>> =A0 =A0end
>> =A0end

>
> This seems a little complicated, not very DRY to write this code for ever=

y
> method.
>
> How does AWS do it?
>
> AWS::S3::Base.establish_connection!()
> and then just:
> Bucket.create('jukebox')


I do not have insights into AWS beyond what can be gatherere from
http://amazon.rubyforge.org/. I don't find this pattern very
appealing. For something like this to work you need to resort to some
form of global state (global variable, constant, class instance
variable, thread local variable) which means there is potential for
problems when working with multiple threads. Another issue is that it
is not obvious, i.e. you do not see that there is something
transported behind the scenes.

I would at least refrain from placing this pattern in a library unless
it is thread safe and it is sure that there will and can never be the
need for more than a single connection which seems doubtful in case of
AWS.

My 0.02EUR.

Kind regards

robert

--=20
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

 
Reply With Quote
 
Marcelo Barbudas
Guest
Posts: n/a
 
      05-05-2009

> I do not have insights into AWS beyond what can be gatherere from
> http://amazon.rubyforge.org/. I don't find this pattern very
> appealing. For something like this to work you need to resort to some
> form of global state (global variable, constant, class instance
> variable, thread local variable) which means there is potential for
> problems when working with multiple threads. Another issue is that it
> is not obvious, i.e. you do not see that there is something
> transported behind the scenes.
>
> I would at least refrain from placing this pattern in a library unless
> it is thread safe and it is sure that there will and can never be the
> need for more than a single connection which seems doubtful in case of
> AWS.
>

I understand. How do you mimic an ActiveResource like structure then?

Something like:
conn = Main.new(user, pass)
conn.resources.method_from_resource_class_that_use s_main_for
the_actual_request_method

--
M.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Question regarding interaction between modules and classes Geometric Patterns Ruby 2 05-08-2011 03:34 AM
Re: Big projects divided into modules and sub-modules ImpalerCore C Programming 0 03-10-2011 03:01 PM
Modules and Classes, Includes and Extends Alpha Blue Ruby 0 01-30-2010 11:42 PM
A question about big projects and classes within classes August0866 Ruby 1 03-17-2008 12:02 AM



Advertisments