1

我正在用 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. 然后我被问到我想删除哪个模块,所以我输入了我之前添加到它的模块之一,但我被告知该模块在方案中不存在。

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

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

任何帮助将非常感激!

4

1 回答 1

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为真?你刚刚测试它不是真的。

您的“方案存在”看起来很像您的“模块存在”,如果它们相同,则使它们相同。有很多chopping 正在进行,也许您应该在输入后切碎并停止在其他任何地方切碎——这似乎容易出错并增加了很多噪音。

总的来说,我发现如果不实际单步执行代码,就很难推理出你的代码。我建议重构,让事情像您要解决的问题一样“大声”读出。

我们也不知道有没有其他的东西$schemes。您是否“应该”使用数据库完全取决于您的目标、您的约束、您运行应用程序的方式等。您还可以序列化 YAML、编写纯文本文件等等。

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

于 2012-08-22T17:23:06.223 回答