Code organization and modules

B

Brad Ottoson

I'm working on an application for generating code skeletons from xml
template files and have run into a snag. I'm trying to organize a set
of code in a directory and inside that use modules. I have a set of
files in a subdirectory of my project directory called lang_cpp. I'll
paste in some code to show what I'm trying.

--method_constructor.rb(in lang_cpp directory):

module XTECpp::MethodConstructor
def getDeclaration(codeClass)
return " " + codeClass.name + "();\n"
end
end

--method_destructor.rb(in lang_cpp directory):
module XTECpp::MethodDestructor
def getDeclaration(codeClass)
return " ~" + codeClass.name + "();\n"
end
end

Later in some other code I include the files using:
require 'lang_cpp/method_constructor.rb'
require 'lang_cpp/method_destructor.rb'

which seems to work fine. Later on I try the following:
case funItem.name
when "empty_constructor"
headerString <<
XTECpp::MethodConstructor::getDeclaration(codeClass)
when "empty_destructor"
headerString <<
XTECpp::MethodDestructor::getDeclaration(codeClass)
when "operator_equality_assignment"
headerString <<
XTECpp::MethodEqualityAssign::getDeclaration(codeClass)
when "readugp"
headerString <<
XTECpp::MethodReadUGP::getDeclaration(codeClass)
end

and when I run it I get the error:

C:\code\Ruby\XMLTemplateEngine\lib/lang_cpp/method_constructor.rb:5:
uninitialized constant XTECpp (NameError)
from C:\code\Ruby\XMLTemplateEngine\lib/lang_cpp.rb:6:in `require'
from C:\code\Ruby\XMLTemplateEngine\lib/lang_cpp.rb:6
from C:/code/Ruby/XMLTemplateEngine/lib/main.rb:6:in `require'
from C:/code/Ruby/XMLTemplateEngine/lib/main.rb:6

I tried changing the module names to the form XTECpp_MethodConstructor
so each function was in it's own unique module but I got errors doing
that too. I'm not sure if you can ever do things this way in Ruby but
I'd like to since this organization appeals to me.
 
R

Robert Klemme

I'm working on an application for generating code skeletons from xml
template files and have run into a snag. I'm trying to organize a set
of code in a directory and inside that use modules. I have a set of
files in a subdirectory of my project directory called lang_cpp. I'll
paste in some code to show what I'm trying.

--method_constructor.rb(in lang_cpp directory):

module XTECpp::MethodConstructor
def getDeclaration(codeClass)
return " " + codeClass.name + "();\n"
end
end

--method_destructor.rb(in lang_cpp directory):
module XTECpp::MethodDestructor
def getDeclaration(codeClass)
return " ~" + codeClass.name + "();\n"
end
end

Later in some other code I include the files using:
require 'lang_cpp/method_constructor.rb'
require 'lang_cpp/method_destructor.rb'

which seems to work fine. Later on I try the following:
case funItem.name
when "empty_constructor"
headerString <<
XTECpp::MethodConstructor::getDeclaration(codeClass)
when "empty_destructor"
headerString <<
XTECpp::MethodDestructor::getDeclaration(codeClass)
when "operator_equality_assignment"
headerString <<
XTECpp::MethodEqualityAssign::getDeclaration(codeClass)
when "readugp"
headerString <<
XTECpp::MethodReadUGP::getDeclaration(codeClass)
end

and when I run it I get the error:

C:\code\Ruby\XMLTemplateEngine\lib/lang_cpp/method_constructor.rb:5:
uninitialized constant XTECpp (NameError)
from C:\code\Ruby\XMLTemplateEngine\lib/lang_cpp.rb:6:in `require'
from C:\code\Ruby\XMLTemplateEngine\lib/lang_cpp.rb:6
from C:/code/Ruby/XMLTemplateEngine/lib/main.rb:6:in `require'
from C:/code/Ruby/XMLTemplateEngine/lib/main.rb:6

I tried changing the module names to the form XTECpp_MethodConstructor
so each function was in it's own unique module but I got errors doing
that too. I'm not sure if you can ever do things this way in Ruby but
I'd like to since this organization appeals to me.

You want to use modules as namespaces but actually you define instance
methods in modules. A small change will provide what you want:

module XTECpp::MethodConstructor
def self.getDeclaration(codeClass)
return " " + codeClass.name + "();\n"
end
end

A few other remarks: if you have just one method per module then the
idea with namespaces does not really make sense.

You use camelCase for method names while in Ruby code this_style is
conventionally used.

Your methods return leading whitespace which I assume serves to do some
indentation (and also a trailing linefeed). I would not do that but let
the invoking code make sure indentation is properly - otherwise you
limit yourself to a single level of indentation. Also modularity of
your code suffers because now your getXXX methods return a piece of code
*and* do indentation.

Kind regards

robert
 
B

Brad Ottoson

Thanks for the fix and the advice. Using the self.getDeclaration fixed
some problems. I also realized I needed to have the module XTECpp
declared somewhere and that fixed the rest of the errors.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,070
Latest member
BiogenixGummies

Latest Threads

Top