2016.11.21隨筆

今天花了不少時間寫oop中的RPS(剪刀石頭布),雖然一直撞牆到快吐血,但是也學到了不少東西,簡單記錄一下一點心得還有學到的東西。

關於Git

實在對git還不太熟練,但是git基本上是web developer、或是任何其他需要coding的人都應該熟練的技能。從個人的角度出來可以讓你隨時記錄自己的想法、讓自己的program不要爆炸;從團隊的角度來看可以有效的協助,提高效率。

這幾天都還在衝刺oop的進度,如果進度還算順利,會撥出一整天來看這堂課的內容(How to use Git and Github),希望可以對git的操作更加熟悉。

簡單整理一下git幾個最簡單也是最必要的操作:

git add -u filename:指定預新增的檔案
git commit -m “description” :關於這次變更的敘述
git status -s :顯示修改的當案名稱
git push:提交檔案到預設的repo

拿捏何時需要看別人的code

我始終認為沒有人能夠用只知推向未知,所以所有關於未來的想像基本上都來自於過去某一刻的累積,而學習coding也是一樣,千萬不要想著自己能夠靠想像就能想出超厲害的code,至少需要的是對基礎的了解甚至是熟練才做得到。所以根據不同情況下我處理問題的方法是:

1.毫無想法:我目前的做法是,如果仔細想個十分鐘還是毫無頭緒我就會直接開別人的code來參考。這種情況最常見於剛學完一個新的章節,接著要開始實作時。
2.腦海裡有一點想法:這種情況出現的時候通常是看完別人的code、或是看題目之後覺得自己解得出來。在這種情況下我會起身邊走邊想,直到我能在腦海中解釋為什麼這麼做,並且立刻用evernote記下來,回到位子上開始測試剛剛的想法。
3.腦海裡有較完整的想法:通常這種情況就是直接coding。

關於何時使用class

What would happen if we went even further and introduced 5 more classes, one for each move: Rock, Paper, Scissors, Lizard, and Spock. How would the code change? Can you make it work? After you're done, can you talk about whether this was a good design decision? What are the pros/cons?

在這次的assessment中有一小個作業的內容是,替rock、paper、scissors、spock、lizard都各設一個class,看這樣解題是不是更快、更好。而在這個題型中,我個人的見解是用class解決完全沒有比較快,有時候更好的解法完全不需要用到class。

雖然對於oop還沒有那麼熟練,但是在這一連串的作業下來,教材總是會詢問我們:這樣的情況用class好不好?缺點是什麼?優點是什麼?我想這一小段的課程就是在訓練我們熟練oop並學會去判斷何時該使用class或是其他作法。

題外話:好想寫出漂亮的code啊QAQ

記得initialize variable

今天幹的一件蠢事就是,花了很多時間reference沒有initialize的variable,所以可想而知就是一直卡死在上面。以下用例子解釋有initialized跟not initialized的情況

def move_choose_percentage
hash = {}
self.history.each do |move|
hash[move] = self.history.count(move).to_f / self.history.size
end
self.percentage = ''
end
# Not initialized
def show_percentage
puts "#{self.percentage}"
end
# Initialized
def show_percentage
self.move_choose_percentage
puts "#{self.percentage}"
end

第一段not initialized的情況下,完全無法在show_percentage中執行self.percentage,因為這個getter method必須要在有initialized的情況下instance variable@percentage才會存在,否則無法執行。必須向第二段initialized的情況一樣,先執行self.move_choose_percentage才有辦法。

題外話:該找時間研究一下medium中如何使用markdown來整理code的排版了@@。

object無法隨意存取其他object,但可以用class variable解決

Instance variable:are used to track individual object state, and do not cross over between objects.

關於這部分的想法還不夠清晰,但是這個今天這個情況是發生在我試圖用class Computer的object去reference 同為Player 的 subclass class Human的object時發生的,而後來我才發現似乎無法跨object來做這件事。 所以我後來的做法是用class variable來幫助自己解決跨兩個subclass互相存取的問題,擷取部份的code如下:

class Human < Player
def human_percentage_over_50
result = self.move_choosen_percentage.select do |move, percentage|
percentage >= 0.5
end
@@human_percentage = result.keys.first
end
end
class Computer < Player
def choose
if @@human_percentage != nil
self.move =
Move.new(LOSING_CONDITION[@@human_percentage].sample)
else
self.move = Move.new(Move::VALUES.sample)
end
self.history << self.move.value
end
end

小結:雖然過程很痛苦,但是還是學到不少東西。明天會繼續把這個assignment剩下的部分結束,繼續往Tic Tac Toe還有21這兩個assignments出發。