1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
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!
1 2 3 4 5 6 7 8 9
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
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!
1 2 3 4 5 6 7 8 9 10
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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.
1 2 3 4 5 6 7 8 9 10 11
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
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