2015-08-05 3 views
-3

Мне нужно взять один код файла ниже и разделить его на рубиновую программу Model, View, Controller (MVC), которая может выполняться командой ruby в командной строке без использования Rails (для получения инструкций о том, как запустить эту программу с irb, ознакомьтесь с README.md на моем RubyBank Github Repo).Включение одного файла в MVC без Rails

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 

Я ищу хорошее место для начала или общий подход к выполнению такой задачи.

+3

Что должно делать приложение? Ваш класс 'BankAccount' _is_ модель (минус текстовый вывод, если это не просто регистрация). Теперь вам нужен какой-то класс «Просмотр» и «Контроллер», который изменяет модель в результате действия в «Просмотр». У вас должны быть некоторые спецификации, в которых указываются: a) какие действия должны быть возможны, и b) какой вид представления вы должны создавать (веб, консоль, рабочий стол, ..), или вам будет сложно выполнять требования ваших клиентов/учителей. – atamanroman

+0

Приложение должно приветствовать их из командной строки, предлагать им зарегистрироваться для учетной записи, а затем разрешать им делать депозиты, снимать или показывать их текущий баланс. –

+1

В этом случае приложение основано на консоли. Методы, в которых у вас есть «puts», могут быть преобразованы в разные представления (или разные методы общего представления). Ваш контроллер должен принимать входные данные с консоли, вызывая соответствующие части модели по мере необходимости (например, создавая экземпляр «BankAccount.new», когда кто-то подписывается, вызывая депозит при его спросе и т. Д.) И решая, какое представление отображать дальше. –

ответ

2

Простой подход был бы создать три класса: вывод текста

BankAccount минус ваш Model.

Все текстовые ввод-вывод поступает в ваш View. Подскажите пользователю о действии или регистрации. Получите модель (для отображения данных) с вашего контроллера или используйте модель напрямую.

Ваш Controller несет ответственность за: a) реагирование на ввод пользователя, b) изменение модели и c) на наличие состояния, не связанного напрямую с BankAccount (этот момент обсуждается), например, во время входа в систему или каких действий возможны из вашего Текущее состояние. Ваш Controller получает все действия с предоставленными пользователем данными из вашего представления.

Чистое разделение между View и контроллером может быть немного сложным в консольном приложении. Кроме того, существует около миллиона возможных способов реализации этого в стиле MVC. Самый важный момент: в вашей модели нет UI-кода (помещает/получает).

+0

Это имеет смысл для меня. Что для меня не имеет смысла, так это то, как вы можете заставить файлы своего вида и файлы контроллера играть друг с другом или общаться друг с другом. –

+1

Ну, вы передаете свою модель и посмотрите на свой контроллер. Если я войду в «снять 2000», представление перейдет к вашему контроллеру. Там вы решите, что пользовательский ввод означает «call remove (user_pin, 2000)». Затем вам нужно обновить представление, потому что модель (свободные деньги) изменилась. Часто это делается путем уведомления представления из модели.В вашем случае вы должны быть добрыми, если вы переигрываете после каждого действия. – atamanroman

+0

Итак, теоретически, если бы я должен был положить 'yes_or_no = gets.chomp' в файл вида, как бы мне заставить его связываться с' if/else' в файле контроллера? –

Смежные вопросы