def which_class?
if self.language == "C/C++"
self.language = "sh_cpp"
else self.language = self.language
end
if self.language == "C#"
self.language = "sh_csharp"
else self.language = self.language
end
if self.language == "CSS"
self.language = "sh_css"
else self.language = self.language
end
if self.language == "Flex/ActionScript"
self.language = "sh_flex"
else self.language = self.language
end
if self.language == "Java"
self.language = "sh_java"
else self.language = self.language
end
if self.language == "Javascript"
self.language = "sh_javascript"
else self.language = self.language
end
if self.language == "Pascal"
self.language = "sh_pascal"
else self.language = self.language
end
if self.language == "Perl"
self.language = "sh_perl"
else self.language = self.language
end
if self.language == "PHP"
self.language = "sh_php"
else self.language = self.language
end
if self.language == "Python"
self.language = "sh_python"
else self.language = self.language
end
if self.language == "Ruby"
self.language = "sh_ruby"
else self.language = self.language
end
if self.language == "Shell"
self.language = "sh_sh"
else self.language = self.language
end
if self.language == "SQL"
self.language = "sh_sql"
else self.language = self.language
end
if self.language == "XML"
self.language = "sh_xml"
else self.language = self.language
end
end
Refactorings
No refactoring yet !
Jeremy Weiskotten
December 10, 2007, December 10, 2007 00:21, permalink
A couple of initial impressions:
1. A method that ends with a question mark, by convention, is expected to return a boolean. So the method which_class? should be which_class if only to avoid confusion.
2. The use of "else self.language = self.language" is unnecessary. It doesn't add anything, and just makes the code much noisier.
3. It seems odd to be setting self.language, but I don't have enough context to really understand how this method is used.
I'll post a more extensive refactoring in a bit.
def which_class
if self.language == "C/C++"
self.language = "sh_cpp"
elsif self.language == "C#"
self.language = "sh_csharp"
elsif self.language == "CSS"
self.language = "sh_css"
elsif self.language == "Flex/ActionScript"
self.language = "sh_flex"
elsif self.language == "Java"
self.language = "sh_java"
elsif self.language == "Javascript"
self.language = "sh_javascript"
elsif self.language == "Pascal"
self.language = "sh_pascal"
elsif self.language == "Perl"
self.language = "sh_perl"
elsif self.language == "PHP"
self.language = "sh_php"
elsif self.language == "Python"
self.language = "sh_python"
elsif self.language == "Ruby"
self.language = "sh_ruby"
elsif self.language == "Shell"
self.language = "sh_sh"
elsif self.language == "SQL"
self.language = "sh_sql"
elsif self.language == "XML"
self.language = "sh_xml"
end
end
Garrett
December 10, 2007, December 10, 2007 00:26, permalink
thanks, im very new to programming as you can see lol, im integrating a syntax highlighter on my school project.
Jeremy Weiskotten
December 10, 2007, December 10, 2007 00:28, permalink
Here's another solution. Please rate this refactoring if it helps!
def which_class?
lang = self.language.downcase
lang.gsub!('+', 'p')
lang.sub!('c/', '')
lang.sub!('/actionscript', '')
lang.sub!('#', 'sharp')
lang.sub!('shell', 'sh')
self.language = "sh_#{lang}"
end
Jeremy Weiskotten
December 10, 2007, December 10, 2007 00:31, permalink
Here's another way to do it, using a simple lookup table:
def which_class?
self.language = 'sh_' +
{
"C/C++" => "cpp",
"C#" => "csharp",
"CSS" => "css",
"Flex/ActionScript" => "flex",
"Java" => "java",
"Javascript" => "javascript",
"Pascal" => "pascal",
"Perl" => "perl",
"PHP" => "php",
"Python" => "python",
"Ruby" => "ruby",
"Shell" => "sh",
"SQL" => "sql",
"XML" => "xml",
}[self.language]
end
Ben Burkert
December 10, 2007, December 10, 2007 00:32, permalink
I think what you are trying to do is filter the class column in the database. I'd suggest using a map or a case statement instead of those ifs. Also, you can define a new setter for language that can handle the filtering.
Also naming the method which_class? is not kosher. This is a dangerous method, and does not return a boolean, so it should be called which_class!
LANGUAGE_MAP = {
"C/C++" => "sh_cpp",
"C#" => "sh_csharp",
#...
"XML" => "sh_xml"
}
def language=(value)
write_attribute(:language, LANGUAGE_MAP[value])
end
Ben Burkert
December 10, 2007, December 10, 2007 00:36, permalink
Here it is with a case statement.
def language=(value)
write_attribute(:language, language_filter(value))
end
def language_filter(value)
case value
when "C/C++"
"sh_cpp"
when "C#"
"sh_csharp"
#...
else
value
end
end
Scott Robinson
December 10, 2007, December 10, 2007 00:38, permalink
The regular expression version is cute. But, it isn't very future proof or robust to odd inputs.
def which_class
langs = {"C/C++" => "cpp", "C#" => "csharp",
"CSS" => "css", "Flex/ActionScript" => "flex",
"Java" => "java", "Javascript" => "javascript",
"Pascal" => "pascal", "Perl" => "perl",
"PHP" => "php", "Python" => "python",
"Ruby" => "ruby", "Shell" => "sh",
"SQL" => "sql", "XML" => "xml"}
self.language = 'sh_' + (langs[self.language] or 'unknown')
end
Vime
December 10, 2007, December 10, 2007 13:11, permalink
You can use the 'default' value for unmatched hashes
def which_class
langs = { "C/C++" => "sh_cpp",
"C#" => "sh_csharp",
"CSS" => "sh_css",
"Flex/ActionScript" => "sh_flex",
"Java" => "sh_java",
"Javascript" => "sh_javascript",
"Pascal" => "sh_pascal",
"Perl" => "sh_perl",
"PHP" => "sh_php",
"Python" => "sh_python",
"Ruby" => "sh_ruby",
"Shell" => "sh_sh",
"SQL" => "sh_sql",
"XML" => "sh_xml" }
langs.default = "unknown"
self.language = langs[self.language]
end
language is a column in a category table...i display what is actually stored in the table in a option select field, but to get the right html class for my css highlighting i need to rewrite what was chosen to print out to a html page in a text area as a class