回答編集履歴

1

質問に対する追記を行いました

2017/10/04 05:26

投稿

mingos
mingos

スコア4025

test CHANGED
@@ -397,3 +397,209 @@
397
397
  end
398
398
 
399
399
  ```
400
+
401
+
402
+
403
+ ---
404
+
405
+
406
+
407
+ ## 追記
408
+
409
+
410
+
411
+ > 追記:mingosさんのおすすめコードについて
412
+
413
+ attr_reader :scoreのscoreとdef initialize(customer:)の(customer:)についてです。
414
+
415
+ attr_reader :scoreのscoreですが、mingosさんの例でいくとcommandテーブルのscoreカラムにアクセスするという意味になるのでしょうか?
416
+
417
+
418
+
419
+ attr_reader :scoreは、以下のコードと同じ意味です。
420
+
421
+ ```ruby
422
+
423
+ class UpdateScoreCommand
424
+
425
+ def score
426
+
427
+ @score
428
+
429
+ end
430
+
431
+ end
432
+
433
+ ```
434
+
435
+ コマンドクラスはrailsのモデルではありませんので、データベースのカラムとは関係がありません。
436
+
437
+ ここでは、UpdateScoreCommandという普通のクラスのインスタンス変数として@scoreを使っているだけです。
438
+
439
+
440
+
441
+ データベースと関係するのは、ActiveRecordあるいはApplicationRecordを継承したクラスのみです。
442
+
443
+ railsでは、app/models/以下にあるクラスになります。
444
+
445
+
446
+
447
+
448
+
449
+ > def initialize(customer:)の(customer:)ですが(customer)と「:」の有無によって何が違ってくるのでしょうか?
450
+
451
+ もしよかったら教えていただけないでしょうか?宜しくお願いします。
452
+
453
+
454
+
455
+ rubyの文法で、名前付き引数とかキーワード引数などと呼ばれるものです。
456
+
457
+ このようにメソッドを定義した場合、必ず、メソッド名(customer: 値) という風に使わないとエラーとなります。
458
+
459
+ 引数が2つ、3つとかになって来るとありがたみが出てきます。
460
+
461
+ 普通のメソッドは引数の順番を覚えておかなければいけませんが、キーワード引数であれば、引数に名前がついているので順序は適当で良いです。
462
+
463
+
464
+
465
+ あまりいい例が思いつきませんが、
466
+
467
+ ```ruby
468
+
469
+ def sum(a:, b:)
470
+
471
+ a + b
472
+
473
+ end
474
+
475
+
476
+
477
+ # キーワード引数なら、引数の順序はばらばらでもいい。
478
+
479
+ puts sum(b: 10, a: 5)
480
+
481
+ puts sum(a: 30, b: 30)
482
+
483
+ ```
484
+
485
+
486
+
487
+ これを使う理由は、コード自体が説明書になるからですね。
488
+
489
+ 今回の例では引数が1つなので、メリットはありませんが、常にこう書いたほうが楽なので。
490
+
491
+ 実際いろいろやってると、メソッドの引数が3つ、4つ、5つって事が出て来ると思います。
492
+
493
+ そうなると、順番を確認するために毎回メソッド定義を見なくてはいけないくてしんどいです。
494
+
495
+
496
+
497
+ 例えば、コマンド引数を増やしてみます。
498
+
499
+ 基本的には+100ですが、任意に追加するポイントを変更できるようにしたい・・と無理やり条件を考えてみます。
500
+
501
+ ```ruby
502
+
503
+ class UpdateScoreCommand
504
+
505
+
506
+
507
+ def initialize(customer:, add: 100)
508
+
509
+ @customer = customer
510
+
511
+ @score = customer.score
512
+
513
+ @add = add.to_i # 文字列とか来るかもしれないので、数値にする
514
+
515
+ end
516
+
517
+
518
+
519
+ def run!
520
+
521
+ @score.sc1 = @customer.point + @add
522
+
523
+ @score.save!
524
+
525
+ end
526
+
527
+ end
528
+
529
+
530
+
531
+ customer = Customer.find(1)
532
+
533
+ c = UpdateScoreCommand.new(customer: customer, add: 500)
534
+
535
+ c.run!
536
+
537
+ ```
538
+
539
+
540
+
541
+ もし、キーワード引数を使わないとすると、こうですね。
542
+
543
+ ```ruby
544
+
545
+ class UpdateScoreCommand
546
+
547
+
548
+
549
+ def initialize(customer, add)
550
+
551
+ @customer = customer
552
+
553
+ @score = customer.score
554
+
555
+ @add = add.to_i
556
+
557
+ end
558
+
559
+ end
560
+
561
+
562
+
563
+ c = UpdateScoreCommand.new(customer, 500)
564
+
565
+ ```
566
+
567
+
568
+
569
+ 仕事でプログラミングをやっていると数年前に書いたものを修正したりすることがよくあるのですが、
570
+
571
+ その頃にはもう自分で書いたものでさえ覚えていません。
572
+
573
+ まずは、コードの全体を把握しなければいけませんが、各メソッドの詳細を見なくても、
574
+
575
+ たぶんこういう事をしているんだろうな、という想像が出来るコードであって欲しいのです。
576
+
577
+
578
+
579
+ ```ruby
580
+
581
+ c = UpdateScoreCommand.new(customer: customer, add: 500)
582
+
583
+ ```
584
+
585
+
586
+
587
+ ```
588
+
589
+ c = UpdateScoreCommand.new(customer, 500)
590
+
591
+ ```
592
+
593
+
594
+
595
+ では、どっちが良いかという話なんですね。
596
+
597
+ 時が経っていると、自分で書いたコードでありながら、500ってなんだよ?みたいな気持ちになります。
598
+
599
+ 前者もベストとは思いませんが、addって書いてあるので、まぁ500を足すんだろうくらいの予想ができます。
600
+
601
+ クラス名もUpdateScore。。。って書いてあるし。
602
+
603
+ この単純な例では、どっちでも良いという思うかもしれませんが、実際のコードはもっと複雑です。
604
+
605
+ うーん、うまい説明が出来なくて申し訳ないんですが、将来自分が困らないために面倒でもキーワード引数を使っているわけです。