アルフォート生活🍫💴

3年後の自分のために、知識をアルフォートの箱に詰めていきます💴

MVCモデル

MVCとは

ソフトウェアの設計モデルの一つで、機能を「Model」「View」「Controller」の三つの役割に分離して実装し、それらが連携して処理を進める方式。

 

Model

システムの中でビジネスロジックを担当し、SQLなどのデータや、計算の途中結果など、Model内部でデータを保持する事で、モデルを一回ずつ再生成(リフレッシュ?)する必要がなく、管理を行いやすくする。

 

View

実際に表示したり、入力する機能の処理をを行い、HTMLなどの表示を動的に生成する。

 

Controller

ボタンが押されたなどのイベントや、modelの持っているデータをviewに渡すなど、ユーザーからの入力をmodelへと変換して伝え、modelの処理結果をviewに渡す要素でであり。
基本的にmodel内のデータを直接操作する事はしない。

 

ルーティング

リクエストURLと処理を紐付けを行うcontrollerの機能の一部で、ルーティングの中で1つのMVCモデルを持っている。

f:id:sekai_in_wonder:20210823164016p:plain

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】テスト用プログラム

require './[ファイル名]'

class Main
    def self.start
        obj = Sqluser.new()
        obj.setValue
        str = obj.database
    end
end

class Test
    class << self
        def start

        end
        def foo
            puts'\'foooooooooooooo'
        end
    end
end

# Test.start
# Test.foo

# メソッドを実行
puts Main.start
 

【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でのアクセスしかできない。

RailsActiveRecordでは、@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
end

method(name)

no implicit conversion of nil into String

 

グローバル変数の定義には$が必要らしい

$name = ''
def method(str)
puts str
end

method($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

 

おわり☆