MVCモデル
MVCとは
ソフトウェアの設計モデルの一つで、機能を「Model」「View」「Controller」の三つの役割に分離して実装し、それらが連携して処理を進める方式。
Model
システムの中でビジネスロジックを担当し、SQLなどのデータや、計算の途中結果など、Model内部でデータを保持する事で、モデルを一回ずつ再生成(リフレッシュ?)する必要がなく、管理を行いやすくする。
View
実際に表示したり、入力する機能の処理をを行い、HTMLなどの表示を動的に生成する。
Controller
ボタンが押されたなどのイベントや、modelの持っているデータをviewに渡すなど、ユーザーからの入力をmodelへと変換して伝え、modelの処理結果をviewに渡す要素でであり。
基本的にmodel内のデータを直接操作する事はしない。
ルーティング
リクエストURLと処理を紐付けを行うcontrollerの機能の一部で、ルーティングの中で1つのMVCモデルを持っている。
例
MVCモデルに沿って、電卓を作成する
用意するファイルとフォルダ構造
calculator.exe
setting.ini
bin
|-app
|-controller
|-controller.js
|-model
|-application.js
|-cals.js
|-data.js
|-view
|-index.html
|-style
|-style.cs
|-config
処理内容
⓪アプリを起動する
1. [controller]:
エントリーポイントからcontrollerが呼び出され、viewから電卓の画面を表示する
①電卓に[18782]と入力する
1. [controller]:
数字ボタンが押された際のイベントが実行される
2. [model]:
現在の操作状況によって処理を切り替える
3. [model]:
インスタンスを生成し、値(1)を代入する
4. [model]:
ディスプレイ表示用の変数に("1")を代入する
5. [model]:
値をcontrollerに返す
6. [controller]:
modelから受け取った値をviewに出力する処理を行う
7. [view]:
ディスプレイに"1"を出力する
8. [controller]:
数字ボタンが押された際のイベントが実行される
9. [model]:
現在の操作状況によって処理を切り替える
10. [model]:
インスタンスを生成し、値(8)を代入する
11. [model]:
ディスプレイ表示用の変数に現在の値と文字列連結を行い、再代入する
12. [model]:
値をcontrollerに返す
13. [controller]:
modelから受け取った値をviewに出力する処理を行う
14. [view]:
ディスプレイに"18"を出力する
……… 8~9を繰り返す ………
②[×]ボタンを押す
1. [controller]:
[×]ボタンが押された際のイベントが実行される
2. [model]:
現在の操作状況によって処理を切り替える
3. [model]:
入力された数字のインスタンスの値を文字列連結し、数値型に変換したうえで頂の役割を持つインスタンスに値を代入する
4. [model]:
現在のステータスを[×]ボタンが押された状態にする
5. [model]:
入力されたボタンの値のインスタンスをリフレッシュする
6. [controller]:
[×]ボタンが押されている事をviewに表示する処理を行う
7. [view]:
ディスプレイに[×]ボタンが押されている様に表示する
③[2]ボタンを押す
1. [controller]:
数字ボタンが押された際のイベントが実行される
2. [model]:
現在の操作状況によって処理を切り替える
3. [model]:
インスタンスを生成し、値(2)を代入する
4. [model]:
ディスプレイ表示用の変数に("2")を代入する
5. [model]:
値をcontrollerに返す
6. [controller]:
modelから受け取った値をviewに出力する処理を行う
7. [view]:
ディスプレイに"2"を出力する
④[=]ボタンを押す
1. [controller]:
[×]ボタンが押された際のイベントが実行される
2. [model]:
現在のステータス状況によって処理を切り替える
3. [model]:
入力された数字のインスタンスの値を文字列連結し、数値型に変換したうえで頂の役割を持つインスタンスに値を代入する
4. [model]:
直前の項2つを引数として、値を計算する適切なメソッド(×を計算する)を呼び出し、計算結果の役割を持つ変数に戻り値を代入する
5. [model]:
値をcontrollerに返す
6. [model]:
現在のステータスを[=]ボタンが押された状態にする
7. [model]:
入力されたボタンの値のインスタンスをリフレッシュする
8. [model]:
値をcontrollerに返す
9. [controller]:
modelから受け取った値をviewに出力する処理を行う
10. [view]:
ディスプレイに"37564"を出力する
まとめ
MVCモデルをを採用する事で疎結合な設計になり、保守性の向上やテストがしやするくなる!
補足
Railsなどのフレームワークを利用したWEB開発では、ViewやControllerにif文などを記述する事があり、ORMの性質上Modelのみにビジネスロジックを終結させるのは難しい?
【Ruby】テスト用プログラム
【Ruby】クラスの基礎
ゲッターとセッター
[attr_accessor]を使用しないと、インスタンス精製後に外部アクセスが行えない?
[@type]などのようにフィールド変数を定義すれば 、[attr_accessor]を使用しないくてもよいが、[self.type]の様な記述をしたい場合は[attr_accessor]の指定が必須
参照
▽【Ruby】 attr_accessorメソッド初心者入門書~使い方と必要な理由を理解しよう
https://pikawaka.com/ruby/attr_accessor
selfと@の違い
self.nameとした場合、attr_accessorで作成されたメソッドを呼び出す
@nameとした場合は、attr_accessorが裏で保管しているインスタンス変数を読みに行く
attr_accessorの場合はどちらも同じだが、アクセサがなくインスタンス変数しかない場合、@nameでのアクセスしかできない。
RailsのActiveRecordでは、@nameのような変数に格納しているわけではないので、nameというメソッド形式のアクセスが必要となる
@ を使う場合、attr_accessor の記述は書かなくても正常に動作する
# オブジェクトのメソッド(処理)
def attack(character_name)
puts "#{self.name}が~#{@power}ダメージを与えた!""
end
[self.name]を[@name]に変更すると出力されなくなる
[@power]は問題なく出力される
参照
▽【Rails】selfと@の使い分けはどうすればいいでしょうか?
https://teratail.com/questions/202474
静的メソッド定義
1つの場合はself.start
def self.start
/* 処理 */
end
複数の場合はself.start
class << self
def funcA()
/* 処理 */
end
def funcB()
/* 処理 */
end
end
【Ruby】基礎知識
シンボル
シンボルとは主に文字列にコロン記号「:」を前置して定義したもの
メソッドなどの名前を識別するためのラベルをオブジェクト化したもの
ハッシュでのキーとしてよく使用
str = "string" #文字列
sym = :symbol #シンボル
メリット
- 可読性が上がる
- 処理が高速になる
注意点
- 数字などのリテラルのみの値だとシンボルとして使用できない
参照
▽【Ruby入門】コロン記号の意味とシンボルのやさしいまとめ!
https://www.sejuku.net/blog/13094
型変換
to_s 文字列オブジェクトに変換
to_i 数値オブジェクトに変換
to_f Floatクラス(浮動小数点数)に変換
to_sym シンボルに変換
to_h ハッシュオブジェクトに変換
to_a 配列オブジェクトに変換
参照
▽【Ruby】 to_sメソッドの使い方を理解しよう
https://pikawaka.com/ruby/to_s
グローバル変数の定義
初見だと「は???」ってなるやつ
name = ''
def method(str)
puts str
endmethod(name)
no implicit conversion of nil into String
グローバル変数の定義には$が必要らしい
$name = ''
def method(str)
puts str
endmethod($name)
参照
▽Rubyのグローバル変数の使い方
https://uxmilk.jp/43259
Gitでよく使う流れと困ったこと
Gitでよく使う流れ
GitHub リポジトリ作成
※予め空のリポジトリ作成しておく
git init
git clone "[ URL ]"
git remote add origin "[ URL ]"
git add [ ファイル名 ]
git commit -m "[ コメント ]"
git branch -M main
git push origin main
GitHub pull&push
git pull origin main
git add [ ファイル名 ]
git commit -m "[ コメント ]"
git push origin main
GitHub clone
user.name "[ ユーザー名 ]"
user.email "[ メールアドレス ]"
git init
git branch -M main
git merge
GitHub origin削除
git remote rm origin
やりたかった事
Cloud9にGitHubから簡単にcloneしたいよね!
▽AWS Cloud9にgithubからcloneしてくる
https://niki12260714.hatenablog.com/entry/2018/04/20/092339
[gh]コマンドを使うのにはアップデートが必要、[sudo yum]コマンドを使うにはRubyが必要…
sudo apt update
sudo apt install -y ruby
なんてのは勘違いで、[sudo yum…]ではなく、[sudo apt…]
おそらく上の記事はOSがubuntuではない事が理由?
という操作もそもそも必要なく、[git clone "URL"]でクローンできた
問題はここからで
git push origin main
error: src refspec main does not match any.
error: failed to push some refs to 'origin'
恐らく、addまたはcommitを実行した際にmasterファイルが作成され、そのためmasterからmainへのbranch名の書き換えが成功したっぽい。
▽Gitの初期設定時にmasterからmainへbranch名を変更できない場合の対処法
https://qiita.com/ststs/items/6e7773aa33107652e69e
touch README.md
git add README.md
git commit -m "kadai-commit"
[master (root-commit) 7546257] kadai-commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
git branch -M main
pushしようとしたら、リモートのファイルがローカルのファイルも最新版だから、そのファイルにpushできないらしい
そりゃpullしてないから当たり前だよ
意味も分からず、トークンを張り間違えたと思ってもう一度pushしようとしたら別のエラーメッセージが出てハマりました
git push origin main
…
error: failed to push some refs to '…'
…
git push origin main
fatal: Authentication failed for
とりあえずpullしたら、先にmergeする必要があったらしくエラーが返される
merge後にプッシュしたら、READMEがリモートリポジトリに作成されてました
▽[Git] fatal: refusing to merge unrelated historiesを解決する話
https://qiita.com/mei28/items/85bc881ac1f26332ac15
git merge
…
git branch -M main
git push origin maingit merge
…
git branch -M main
git push origin main
その後はファイルを作成して、ステージ追加、コミット、プッシュで完了
無駄に時間が溶けました
SourceTreeは偉大!!!
echo "これは最初のコミットです。">> ~/environment/kadai-commit/sample.txt
git add sample.txt
※複数ファイルを指定可能
git commit -m "add sample.txt"
git push origin main
ファイルとディレクトリを間違えて作ってハマった話
やりたかった事
UNIX内でのファイルの移動
起こった事
mkdir memo.txt
echo 'サンプルテキスト' >> ~/environment/memo.txt
「間違えてファイル作ってるううう」
mv -f memo.txt ./kadai-terminal
mv: cannot overwrite directory './kadai-terminal/memo.txt' with non-directory
「フォルダはファイルで上書きできないぞ☆」
rm memo.txt
rm: cannot remove 'memo.txt': Is a directory
rmdir -f memo.txt
Try 'rmdir --help' for more information.
rmdir --help
-p, --parents remove DIRECTORY and its ancestors; e.g., 'rmdir -p a/b/c' is
similar to 'rmdir a/b/c a/b a'
「そんなオプション始めて聞いたよ!!」
「そもそもディレクトリとファイルの削除の仕方違うなんて知らなかった!!」
rmdir -p memo.txt
mv memo.txt ./kadai-terminal
「やっとできた!!!」
他に学んだ事
'echo'は文字列を表示させるだけでなく、
ファイル名を指定する事でファイルに書き込みを行う事もできる
echo 'ADD' >> ~/environment/result.txt
cat ~/environment/result.txt
参考
▽UNIX コマンド一覧表
https://www.k-tanaka.net/unix/
https://qiita.com/savaniased/items/d2c5c699188a0f1623ef
おわり☆