アラフォーがお金持ちになるためエンジニア目指すブログ

お金も根性も学歴もないアラフォーまきのがエンジニアになってお金持ち目指すよ!

写経祭り

どうも、アラフォーまきのです。

クラスで詰んでます(笑)で、メンターさんから写経もいいよ!と進められてからガチで写経してみたので、そのことでも。

ついでに、やっとはてなでソースコード貼り付けるやり方がわかったので試してみるぞー!

※6000文字オーバーの超長文(笑)

写経

写経って聞いたことはあったんです。そんなんで何が変わるんだろうなあなんて思ってたのが実際なんですけど、今回いざ自分に取り入れるために、みんなはどんなやり方してるのかなー?って調べて見ました。
 

私は、単に「お手本のコードをみながらエディタへ打ち込む」をひたすら繰り返すんだろうなって思ってたんですが、私のようにどん詰まり中の超初心者の場合、まず筆記用具を持って実際紙にコードを書きまくるのがいいんだそうです。
 

実際、私はどんなことも一度紙に書き出さないと頭に入らない人です。

今回メンターさんとの侍塾が始まるまで、progateやってたときも、ただprogateにしたがってやっているだけだとうまく頭に入らなくて、めっちゃ読み下し文書いたりしてたんです。

 

こちらは8月下旬ごろのpythonやってた時の記録↓ 

 
今はRubyをやってるんですが、ここでこれでもかというほど詰んだので、そこまで書かんでも・・・というくらい読み下してやりました(笑)

 

今回詰んだクラスのコード

過去記事でも出てきましたが、メンターさんが作ってくれた問題のECサイトを作ってみるコードで詰んでました。

 

メンターさんに指導いただきながら半泣きで完成できたコードの全容がこちら。

 

class Product
    attr_accessor :name, :price

    def initialize(name, price)
        @name = name
        @price = price
    end
end

class Book < Product
    attr_accessor :author, :publisher, :page_count
end

class CD < Product
    attr_accessor :artist, :year, :songs
end

class ShoppingCart
    def initialize
        @products = []  
    end

    def add_product(product)
        @products << product
    end

    def print_product_count
        puts "買い物かごに入っている商品は全部で #{@products.size} 個です"
    end

    def print_total_price
        puts "金額は合計 #{self.total_price} 円です"
    end

    def count
        return @products.size
    end
    
    def total_price
        total_price = 0
        @products.each do |item|
            total_price += item.price
        end

        return total_price
    end
end

class User
    attr_accessor :last_name, :first_name, :gender, :age
end

class ShoppingUser < User
    attr_reader :cart
    
    def initialize(cash)
        @cart = ShoppingCart.new
        @cash = cash
    end

    def into_cart(product)
        @cart.add_product(product)
    end

    def money
        return @cash
    end

    def checkout
        money = @cash - @cart.total_price
        if money >= 0
            @cash = money
            return true
        else
            return false
        end
    end
end
  
book1 = Book.new('吾輩は猫である', 1200)
book1.author = '夏目漱石'
book1.publisher = 'ABC出版'
book1.page_count = 340

cd1 = CD.new('崩壊アンプリファー',  1500)
cd1.artist = 'アジアンカンフージェネレーション'
cd1.year = 2004
cd1.songs = ["フラッシュバック", "未来の破片", "電波塔"]

user1 = ShoppingUser.new(10000)
user1.last_name = '山田'
user1.first_name = '花子'
user1.gender = ''
user1.age = 30

user1.into_cart(book1)
user1.into_cart(cd1)
if user1.checkout
  puts "#{user1.last_name}さんは#{user1.cart.count}個の商品を購入し、全部で#{user1.cart.total_price}円支払いました。"
  puts "結果として残りの所持金は#{user1.money}円です。"
else
  puts "#{user1.last_name}さんはチェックアウトできませんでした。"
  puts "なぜなら買い物の合計金額が#{user1.cart.total_price}円なのに対し、所持金は#{user1.money}円しかなかったからです。"
end

この中で、問題として私が書くべきだった箇所は、Bookクラスの定義から、ShoppingUserクラスの定義の部分までで、それ以外は最初からメンターさんが記述済みでした。

超写経&読み下し

今日で写経3日目、同じクラスの写経は4週目なんですけど、とりあえずこんな感じになりました。

写経して、読み下している中で、コード書く順番が気持ち悪く感じる箇所があったので、そこはちょっと順番を入れ替えて書いてあります。

あと、最後に出てくるif文の文章もちょっとだるかったので少し短く(笑)

f:id:MmRevorution:20181007163601j:plain
f:id:MmRevorution:20181007163652j:plain
f:id:MmRevorution:20181007163712j:plain
f:id:MmRevorution:20181007163738j:plain
f:id:MmRevorution:20181007163759j:plain
f:id:MmRevorution:20181007163907j:plain
f:id:MmRevorution:20181007163925j:plain

私の詰みポイント1

4枚目の「30」に出てくる

attr_reader :cart

こいつ!この発想がどーーーーーしてもできなかった。
だって、2枚目の「10」「11」で、

class ShoppingCart
    def initialize
        @products = []  
    end

    def add_product(product)
        @products << product
    end

って、すでに@productsって配列に商品が入っていくようにして、買い物かごは定義済みなのに、どうしてまたここでcart書かなきゃいけないのさー!と。

でも、こうやって4枚目「30」のように書いてあげないと、ただお店にかごが平積みしてあるだけになっちゃうんだよね。

これがわからなかった。
実際お客さんにかご持って歩いてもらわないと、商品をかごに入れることできないのにねえ。

この発想ができなかったばっかりに、最後のif文に出てくる

#{user1.cart.count}

とか

#{user1.cart.total_price}

の「cart」がどこからきたものかわからなくて、どうしたらいいのかわからなかった。

最初の方に書いた通り、各インスタンスの部分はすでにメンターさんが書かれていたので、私はそこに手を加える必要がなかったんです。

だけど、当時の私は

user1.cart.count

ってなるには、

user1 = ShoppingUser.new(10000)
user1.last_name = '山田'
user1.first_name = '花子'
user1.gender = ''
user1.age = 30
user1.cart = ○○

みたいにならないとおかしいじゃん!でも最後の

user1.cart = ○○

がないじゃん!!

でも、仮に

user1.cart = ○○

があったとして、○○には何がはいるんだ?どうしたらいいんだ?

こんな感じでした。
メンターさんにこのことがなかなかうまく伝わらなくて、特別授業を組んでいただいた次第でした(笑)

私の詰みポイント2

4枚目位「31」

@cart = ShoppingCart.new

これ!!

これもまったく微塵も発想できなかった。

これ、ShoppingUserクラスで、ShoppingCartクラスのインスタンスを生成したんですよね?

違うクラスのインスタンスを生成できるなんてそんなのありかよー!

ありだよ!

メンターさんとこの1行書いた時は、似たクラス名だったので別のクラスのインスタンス書いてるって気がつかなくて、授業終了後、2回目の写経で初めて「何こいつ!!」ってなったんです。

「なにひとんちで子供産んでんだよ」くらい謎な1行だと思ったけれど、別にこれアリなんだ!
これは目から鱗!目玉が飛び出る勢い(笑)

でもそうしないと、ShoppingCartの機能をもったお買い物かごにならないじゃん。

3週目あたりでようやくその辺わかってきました。

写経すごい

これ以外に、前回の記事で書いた通り、家族を題材にしたクラスをメンターさんが書いてくれていたので、そっちも写経しました。

そっちはまだ1回しか写経していないけれど、その例がめっちゃわかりやすかったので、なんと改造もすんなりできました!

元々は1つの家族を作るクラスだったけど、2つめの家族も作ってみたり、子供の数だけ出力してみたり。

手で書けば書くほど、何をやっているのかだんだんわかってくる。
やばい超楽しい(笑)

今回のように一部を埋めるような場合、既に書かれているコードで何が起きているのかってうのが、実際に自分で書いてないから、わかってるようでわかってなかった。

これが、手で文字を書き出すと、えぇ!?って気がつくことがたくさんあって本当に面白い。

マジで初心者の方はこうやって手書きの写経やってみるといいと思う。

まとめ

家族クラスと今回のお買い物クラスはどっちもまったく同じことをやっているのに、お買い物クラスはべらぼうにむずかしかった。

それって、自分が普段お買い物するのにどういうロジックがあったのか、どういう行動をしていたのか、よく理解してなかったからかも。

まあ、普段そんなこと気にして買い物しないしね。

でもこうやって普段の当たり前が、コードになるとこんなロジックだったんだ!ってのは超おもしろいですよね〜。
なんか感激しちゃったよ、「こ・・・こんなことだったなんて!!」って(笑)

もうほんっとに楽しくって!このアラフォーに到るまでの間に、これほどまでに「知ること」「わかること」を楽しく思ったことないよ。

なぜ高校の時そのままプログラムいじれそうな道に進まなかったのか・・・。
まあ、私には今だったんだよねきっと。

まだ理解できていない部分も多いので、当分写経は続けます。コードももっと違うものも書いてみたいし。

あと、なんとかソースコード綺麗に貼れてるみたいでよかった!
あとは行数を表示できるらしいのでそれもやってみたいなあ。

あと、マジでドライゼロおすすめ(笑)
毎日飲んでる。ノンアルの中で一番おいしいよね!
今日も(ノンアル)ビール飲みながら写経だよ!
みんなも(ノンアル)ビール飲みながら写経しよー!!(笑)

アサヒ ドライゼロ ノンアルコール 350ml×24本

アサヒ ドライゼロ ノンアルコール 350ml×24本