【问题标题】:Turning a single file into MVC without Rails在没有 Rails 的情况下将单个文件转换为 MVC
【发布时间】:2015-08-05 15:23:44
【问题描述】:

我需要将下面的单个文件代码分离成一个模型、视图、控制器 (MVC) ruby​​ 程序,该程序可以在不使用 Rails 的情况下通过命令行中的ruby 命令运行(有关如何运行的说明这个程序来自irb,请查看我的RubyBank Github Repo 上的 README.md。

require_relative 'view'

class BankAccount
  attr_accessor :name, :balance
  def initialize(name, balance=0)
    @name = name
    @balance = balance
  end
  def show_balance(pin_access)
    if pin_access == pin || pin_access == bank_manager 
      puts "\nYour current balance is: $#{@balance}"
    else
      puts pin_error_message
    end
  end
  def withdraw(pin_access, amount)
    if pin_access == pin 
      @balance -= amount
      puts "'\nYou just withdrew $#{amount} from your account. \n\nYour remaining balance is: $#{@balance}\n\n"
    else
      puts pin_error_message
    end
    if @balance < 0
      @balance += amount
      return overdraft_protection
    end
  end
  def deposit(pin_access, amount)
    if pin_access == pin
      @balance += amount
      puts "\nYou just deposited $#{amount} into your account. \n\nYour remaining balance is: $#{@balance}"
    else
      puts pin_error_message
    end
  end

  private
  def pin
    @pin = 1234
  end
  def bank_manager
    @bank_manager = 4321
  end
  def pin_error_message
    puts "Invalid PIN number. Try again."
  end
  def overdraft_protection
    puts "\nYou have overdrafted your account. We cannot complete your withdrawl. Please deposit money before trying again. \n\nYour corrected balance is $#{@balance}"
  end
end

我正在寻找一个好的起点或一个完成此类任务的一般方法。

【问题讨论】:

  • 应用程序应该做什么?您的课程BankAccount 模型(减去文本输出,如果它不只是记录的话)。你现在需要的是某种View 和一个Controller 类,它将模型修改为View 中的一个动作。您必须有一些规范,说明 a) 哪些操作必须是可能的,b) 您必须创建哪种视图(Web、控制台、桌面等),否则您将很难满足客户/教师的要求。
  • 应用程序应该从命令行问候他们,提示他们注册一个帐户,然后允许他们存款、取款或显示他们当前的余额。
  • 在这种情况下,应用程序是基于控制台的。您当前拥有“放置”的方法可以转换为不同的视图(或通用视图的不同方法)。您的控制器应该接受来自控制台的输入,根据需要调用模型的相关部分(例如,当有人注册时实例化 BankAccount.new,在被询问时调用存款等),并决定接下来要显示哪个视图。
  • “这个任务超出了我目前的技能范围;它让我感到困惑。”虽然这看起来很刻薄,但练习的重点是让你弄清楚这一点。学习并不总是那么容易;很多时候,当我们探索不同的方式来达到我们想去的地方时,我们会花几天的时间感到困惑,似乎没有取得任何进展。在我们学习了我们正在使用的语言的模式和来龙去脉之前,这就是编程可以做到的。我们应该足智多谋,并且想办法解决这个问题。我们不会死去,但我们会做出英勇的尝试。
  • SO 不适用于外包任务,但绝对有方向。下面我提供了一个我过去用来做你正在尝试的事情的宝石。还可以考虑在一个文件中要求 Rails gems,如 ActiveRecord 和其他文件来完成同样的事情。

标签: ruby model-view-controller


【解决方案1】:

一个简单的方法是创建三个类:

BankAccount 减去文本输出是您的Model

所有文本 I/O 都进入您的 View。提示用户进行操作或注册。从控制器获取模型(用于显示数据)或直接使用模型。

您的 Controller 负责 a) 对用户输入做出反应,b) 修改模型和 c) 保持与 BankAccount 不直接相关的状态(这一点是可讨论的),例如登录或可能的操作你现在的状态。您的 Controller 从您的视图中接收用户提供的数据的所有操作。

在控制台应用程序中,视图和控制器之间的清晰分离可能有点困难。此外,有大约一百万种可能的方法可以在 MVC 样式中实现这一点。最重要的一点:您的模型中没有 UI 代码(放置/获取)。

【讨论】:

  • 这对我来说很有意义。对我来说没有意义的是你应该如何让你的视图文件和控制器文件相互播放或相互通信。
  • 你将模型和视图传递给控制器​​。如果我输入“withdraw 2000”,视图会将其转发给您的控制器。在那里,您决定用户输入的意思是“调用撤回(user_pin,2000)”。然后您需要更新视图,因为模型(可用资金)发生了变化。通常这是通过从模型通知视图来完成的。在您的情况下,如果您在每次操作后重新渲染,您应该会很好。
  • 理论上,如果我将yes_or_no = gets.chomp 放在视图文件中,我将如何让它与控制器文件中的if/else 通信?
  • 您可以致电controller.register(yes_or_no) 或者先收集更多信息并联系controller.register(user_information) if yes_or_no。您在视图中收集数据并将其转发给您的控制器,您可以在其中决定要做什么。我希望您了解总体概念 - 没有正确的解决方案。
  • 大声笑。我非常困惑,在黑暗中四处闲逛。你得到了答案。谢谢。
猜你喜欢
  • 2019-04-17
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 2018-08-15
  • 2021-10-24
  • 1970-01-01
  • 2021-08-01
相关资源
最近更新 更多