2012-08-22 39 views
1

我正在用Ruby编写课程管理程序,以允许用户向模式添加/删除模块。Ruby-节省用户输入

目前,我的程序将允许用户添加模块,但是当我尝试删除它们时,我被告知它们不存在。

我使用添加的模块的方法是:

def self.add_module 
# schemes = {} 
scheme_exists = false 
add_another_scheme = true 
# module_exists = false 
add_another_module = true 

while add_another_scheme 
    print "Enter scheme name: " 
    scheme_name = gets 
    $schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false 

    if !scheme_exists 
    $schemes[scheme_name.chop] = [] 
    puts "Scheme #{scheme_name.chop} has been added to the system" 
    elsif 
    scheme_exists = true 
    puts "This scheme has already been added" 
    end 

    while add_another_module 
    print "Enter module name: " 
    module_name = gets 
    $schemes[scheme_name.chop].include?(module_name.chop) ? true : $schemes[scheme_name.chop] << module_name.chop 
    # puts "Module #{module_name.chop} has been added to #{scheme_name.chop}" 

    # 22/08/2012 at 14:15 Now need to read in each module's unique identifier and year it belongs to 
    print "Enter module ID: " 
    $module_ID =gets 
    $schemes[scheme_name.chop].include?($module_ID.chop) ? true : $schemes[scheme_name.chop] << $module_ID.chop 
    $schemes.has_key?($module_ID.chop) ? module_exists = true : module_exists = false 

    print "Enter the academic year to which the module belongs: " 
    module_year = gets 
    $schemes[scheme_name.chop].include?(module_year.chop) ? true : $schemes[scheme_name.chop] << module_year.chop 

    if !$module_exists 
     $schemes[$module_ID.chop] = [] 
     puts "Module #{$module_ID.chop} : #{module_name.chop} has been added to #{scheme_name.chop} for the year #{module_year}" 
    elsif 
     $module_exists = true 
     puts "A module with this ID has already been added to the scheme, please check if the module already exists, or choose another ID " 
    else 
    # puts "Module #{module_name.chop}, #{module_ID.chop} has been added to #{scheme_name.chop} for the year #{module_year}" 
    end 

    # puts "Module #{module_name.chop}, #{module_ID.chop} has been added to #{scheme_name.chop}" 

    print "Add another module? " 
    ask_if_user_wants_to_add_another_module = gets 
    if(ask_if_user_wants_to_add_another_module.chop == "y" or ask_if_user_wants_to_add_another_module == "yes") 
     add_another_scheme = false 
    else if(ask_if_user_wants_to_add_another_module.chop != "y" or ask_if_user_wants_to_add_another_module != "yes") 
     Application.main_menu 
      end 
    end 

end 

和我使用尽量去除模块的方法是:

def self.remove_module 

print "Which scheme would you like to remove a module from? " 
scheme_name = gets 
$schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false 

if !scheme_exists 
    $schemes[scheme_name.chop] = [] 
    puts "Scheme #{scheme_name.chop} doesn't exist" 
else 
scheme_exists = true 
    puts "Which module would you like to remove from #{scheme_name.chop}?" 
    $module_ID = gets 
    if !$module_exists 
    $schemes[$module_ID.chop] = [] 
    puts "Module #{$module_ID.chop} : does not exist in #{scheme_name.chop} " 
    else 
    module_exists = true 
    puts "Module #{$module_ID.chop} has been removed from #{scheme_name.chop} " 
    # puts "Module #{module_name.chop}, #{module_ID.chop} has been added to #{scheme_name.chop} for the year #{module_year}" 
end 
end 

end 

当我运行程序,会显示一个菜单,我选择将模块添加到调用第一个方法的方案中。我跟进的步骤:

  1. 输入方案名称 - 将显示一个消息,说明该方案已添加到系统
  2. 输入模块名称
  3. 输入模块ID
  4. 输入学年到该模块所属 - 将显示一个消息,说明该模块已被添加到该计划当年
  5. 我问我是否要添加另一个模块,所以我说是
  6. 程序再次运行相同的步骤,但这次跳过第一个,并开始输入模块名称 - 当我再次执行这些步骤时,显示另一条消息,指出第二个模块已经添加到相同的计划,无论我指定的第二次
  7. 然后我被问到是否要添加另一个模块,我输入'n',并返回到原始菜单。
  8. 这一次,我选择的选项从计划中删除模块
  9. 我问我想删除从一个模块,该模块方案,所以我输入我已经添加了模块
  10. 我的一个然后问我想删除哪个模块,因此我输入了之前添加的模块之一,但我被告知该模块不存在于该模式中。

这表明我调用第一种方法(添加模块)时我存储在变量中的数据刚刚在我调用第二种方法(删除模块)时被丢弃。

如何确保这些信息不会丢失?是否有需要设置并连接我的程序的数据库,还是需要使用会话和会话变量?或者是完全不同的东西?

任何帮助将不胜感激!

回答

1

(不是答案。)

我有问题,阅读你的代码。例如:

$schemes.has_key?(scheme_name.chop) ? scheme_exists = true : scheme_exists = false 
# Did you mean: 
scheme_exists = $schemes.has_key?(scheme_name.chop) 

和:

if !scheme_exists 
    $schemes[scheme_name.chop] = [] 
    puts "Scheme #{scheme_name.chop} doesn't exist" 
else 
    scheme_exists = true 
    # ... 

你为什么设置scheme_exists为真?你刚刚测试过它不是是真的。

您的“方案存在”看起来很像您的“模块存在”,如果它们相同,则使它们相同。有很多chop平进行,也许你应该只是在输入后切断,并停止切入其他地方–它似乎很容易出错,并增加了很多噪音。

总的来说,我发现很难推断出你的代码,而没有实际的介绍它。我建议重构,将事情看作“大声”,比如你想要解决的问题。

我们也不知道是否有其他东西碰到$schemes。你是否应该“使用数据库”取决于你的目标,你的约束,你如何运行应用程序等,你完全可以使用。你也可以序列化YAML,编写一个纯文本文件,各种各样的东西。

如果您重新启动/重新运行应用程序,您显然会失去所有未持久的数据。如果你始终在应用程序中,那么很可能是代码或你的假设都是错误的,但是由于它的结构和命名方式,查看代码并确定它是一项繁重的任务。

+0

Re。代码“$ schemes”的第一部分是我存储了用户调用'add module'方法时添加的方案的数组。如果该方案尚未添加 - 我需要让用户知道,因为没有关联的模块要移除,否则(即如果该方案已被添加),那么我需要询问用户哪个模块与该方案相关联他们想要删除。 – Someone2088

+0

Re。代码'scheme_exists'的第二部分与'module_exists'类似,只是它检查方案是否存在,而不是模块是否存在...方案和模块是两个不同的东西。 – Someone2088

+0

@ Someone2088该代码是相同的,只有地图是不同的。相同的代码。您不一定需要相信或理解我所说的内容,但最终如果您希望其他人能够阅读您的代码,则需要对其进行相当程度的更改。现在真的很难相处。 –