Upgrade to Pro — share decks privately, control downloads, hide ads and more …

⚡️Ruby、オブジェクト指向、デザイン / Ruby, OOP, Design

Takumi Shotoku
November 05, 2020

⚡️Ruby、オブジェクト指向、デザイン / Ruby, OOP, Design

Takumi Shotoku

November 05, 2020
Tweet

More Decks by Takumi Shotoku

Other Decks in Technology

Transcript


  1. Ruby、オブジェクト指向、設計
    Omotesando.rb #56 2020/11/05
    1

    View full-size slide

  2. 自己紹介
    • 名前: 神速
    • 会社: メドピア株式会社
    • 所属: CTO室SRE
    • GitHub: @sinsoku (画像右上)
    • Twitter: @sinsoku_listy (画像右下)
    2

    View full-size slide


  3. ちゃんと学びたい人は
    !
    をたくさん読んでください。
    3

    View full-size slide

  4. オブジェクト指向について
    • プログラミングの設計手法
    • データと処理をまとめる
    • Rubyのすべてはオブジェクト
    • 純粋なオブジェクト指向言語
    4

    View full-size slide

  5. オブジェクト指向は設計手法
    プログラミング言語には依存しない
    5

    View full-size slide

  6. C言語でも(頑張れば)OOPできる1
    #include
    struct user_data {
    char name[20];
    };
    char *name(struct user_data *this) {
    return this -> name;
    }
    char first(struct user_data *this) {
    return this -> name[0];
    }
    struct user_class {
    struct user_data obj;
    char *(*name)(struct user_data *this);
    char (*first)(struct user_data *this);
    };
    int main()
    {
    struct user_data this = { "foo" };
    struct user_class u = { this, name, first };
    printf("%s\n", u.name(&this));
    printf("%c\n", u.first(&this));
    }
    1 普通はやらないと思う
    6

    View full-size slide

  7. Rubyだと簡単
    class User
    attr_reader :name
    def initialize(name)
    @name = name
    end
    def first
    name[0]
    end
    end
    u = User.new("foo")
    puts u.name
    puts u.first
    7

    View full-size slide

  8. オブジェクト指向な設計とは?
    8

    View full-size slide

  9. オブジェクト指向
    • 設計に正解は存在しない
    • UserLogin, User#login のどちらでも良い
    • 他メンバーが読みやすいかどうか
    • 名前から処理を予想できるか?
    • ビジネスの用語とズレがないか?
    10

    View full-size slide

  10. オブジェクト指向のSOLID
    • 単一責任の原則
    • 解放閉鎖の原則
    • リスコフの置換原則
    • インターフェース分離の原則
    • 依存性逆転の原則
    11

    View full-size slide

  11. 普段そこまで考えてない
    13

    View full-size slide

  12. コードは短く、読みやすく書く2
    • 短いコードは正義
    • クラスやモジュールを作り過ぎない
    • 最初は単純なメソッドで済ませる
    • メタプロで短くするのは控える
    • パフォーマンスは後で考える
    "
    2 去年の銀座Railsのスライドから引用
    14

    View full-size slide

  13. 考えていること
    15

    View full-size slide

  14. get_xxx を避ける
    Rubyだとgetterは名詞を使うことが多い。
    class User
    # bad
    # def get_items; end
    # good
    def my_items; end
    end
    16

    View full-size slide

  15. !
    英語にして違和感がない3
    クラスを名詞、メソッドを動詞にして違和感ないか?
    class User
    # user login
    def login; end
    # user search by word
    def search_by(word); end
    end
    メソッドが長い場合、クラスを抽出できる可能性がある。
    3 Railsのメソッド名を参考にする事が多い。
    17

    View full-size slide

  16. インスタンス変数を使うようにする
    !
    な例
    class Shop
    def total_price(item, coupon: nil)
    if coupon
    item.price - coupon.discount
    else
    item.price
    end
    end
    end
    18

    View full-size slide

  17. インスタンス変数を使うようにする
    !
    な例。インスタンス変数の分だけ短くなる。
    class Item
    def total_price(coupon: nil)
    if coupon
    price - coupon.discount
    else
    price
    end
    end
    end
    19

    View full-size slide

  18. 脳内メモリを使わない
    foo -> bar -> buz -> piyo の
    ような呼び出しだと変数の値
    を覚えるのが大変。
    class A
    def foo
    bar
    end
    def bar
    buz
    end
    def buz
    piyo
    end
    end
    20

    View full-size slide

  19. 脳内メモリを使わない
    一度に覚えておくことを減ら
    したい。
    class A
    def foo
    x = bar
    y = buz
    z = piyo
    end
    end
    21

    View full-size slide

  20. イミュータブル
    !
    引数を破壊したり、ループを使っている。
    def cool_items(items, service_charge)
    items.each do |item|
    next if item.xxx?
    item.price += service_charge
    end
    items
    end
    22

    View full-size slide

  21. イミュータブル
    !
    関数型プログラミング的
    def cool_items(items, service_charge)
    items.select { |item| item.xxx? }
    .map { |item| Item.new(price: item.price + service_charge)
    end
    end
    23

    View full-size slide

  22. まとめ?
    • 設計の用語はコミュニケーション用
    • みんな普段そこまで考えているの・・・?
    • 短いコードを書こうとすると良い感じになる
    • 気がする
    24

    View full-size slide