2013年3月19日火曜日

#TDDBC Tokyo 2013-03 に参加してきました

いつかは行ってみよう〜っと思っていたTDDBCに参加して来ました。

TDDはもちろんペアプロがすごくよい経験になった、というのが最大の感想です

ドライバーとナビゲーターの入れ替えをあんなに頻繁にやるものなんだ…ということだけでも個人的にはすごくプラスになりました。

主催者やTAの方々、そして当日自分の環境に合わせてペアを組んでくれた @akuraru さん ありがとうございました。

そしてVOYAGE GROUPさん、タダ酒ありがとうございました素敵な会場ありがとうございました。

お題とか詳細は皆さんが各所でまとめてますし、togetterにもまとまってますのでそちらで。





と言ってしまったので書きます。

まず、こんな環境でした。

  • scala2.10 + specs2 + sbtでtestぶん回し

多分気になっている人もいると思いますし、一応こうやりました的なことを書いていきます



TODOもコード?



えーっと、半分本当で半分ウソです。

specs2ではこのような書き方が可能になります。

import org.specs2._
class LtsvSpec extends Specification {
def is =
"TDDBC 2013-03-16 Tokyo".title ^
"""
LTSVを読み込むクラスを作る
今回 @akuraru さんとペアになって短時間で考えた結果
基本的にMapでKey/Valueを保持し
Keyの順番に関してはListで管理することにした
"""^ p^
"LTSV一行を管理するクラス" ^
p^
"key value をsetする場合" ^ set^
"keyを指定して値を取得する場合" ^ get^
"dumpメソッドで出力する場合" ^ dump^
end
def set =
"key/valueを与えるとMapとListが更新される" ! pending ^
"既に保有するキーの場合は、Mapのvalueが更新され、" +
"Listで管理するkeyの順序は更新するキーが最後尾に来る" ! pending ^
"正常系ならEither::Right(None)が返る" ! pending ^
"正常系且つ更新ならEither::Right(Some(古いvalue))が返る" ! pending ^
"keyがnullの場合はLeft" ! pending ^
"keyが空文字はLeft" ! pending ^
"valueがnullはLeft" ! pending ^
"valueは空文字はOK(Right)" ! pending ^
endp
def get =
"keyが存在すればSome(value)が返る" ! pending ^
"keyが存在しなければNoneが返る" ! pending ^
endp
def dump =
"dumpは tab区切り末尾改行のLTSVで出力する" ! pending ^
endp
}


pendingを空のチェックボックス代わりに使っているだけです。
pendingを実際にテストを行うメソッドに書き換えればチェックした!みたいな。
詐欺ですねw

この書き方(specs2のサイトではacceptance specifications とあるので、受け入れテストを前提としている書き方?)だと(甘めに言えば)そのままTODOリスト書いているのと変わらない形で書けますので、
TODOリストもScalaで書いた( ー`дー´)キリッ
と言っても許され…ますよね?

というのを誇張しました、スミマセンでした。

他にもgradle同様HTML出力とかもしてくれますし、spock同様DataTablesもありますし、specs便利です。

ちなみにhtml出力画面はこんな感じ。



話それますが機会があればgradle+spockはとても触りたいですね。
あとScalaTestで同じようなことが出来るかどうかは、使ったこと無いので知りません、ごめんなさい。





なるほど…(ぉぃ
まあnullとか例外とか嫌ですよね。

で、先ほど当日未実装だった部分をテキトーにやったところ、ソースの行数が30行ぐらいになっちゃった。

改行だけの部分のカウントを除いて、dumpメソッドを再度ワンライナーに戻して、あと何かすれば10行程度になるかも?

何れにしても自分のScala力と今回のお題(Exception返せ!とか)だと10行は難しいかも…

ましてやvar使っちゃったし、もう負けてる感満載w



sbtでぶん回す



最近sbtは酢豚と読むらしいです(scala conference jpでそう聞いたw)

sbtではtestと叩くとtestが全実行されますが、「~test」で実行するとファイルが変更される度にtestを回してくれるので大変便利です。
コード書いてセーブすれば勝手に実行される素敵環境がすぐ出来ます。
PCのパワーと電源がある限りひたすらぶん回しておけばいいのです(ぇ

ただ正直なところ…テストケース一つを実行するならJava+JUnit+QuickJUnitのほうが体感速度は速くて気持ちいいと思いますw
Scalaもテストの実行そのものは早いんですけど、コンパイル待ちが…うーん…

結論:もっとマシンパワーがあればなんとかなる



あんまりここで書いちゃうと水曜日の「Scalaを勉強する会」でしゃべることがネタOnlyになっちゃうのでこのへんで許してください。

一応githubにソース置いてますので、興味がありましたら御覧ください。
あ、もちろん「フツーこう書くだろJK」的なご指導ご鞭撻もよろしくお願いします。

https://github.com/daneko/tddbc




そうそう、ペアプロにおいて環境の違いはどうやって埋めるべきなんでしょうね?
自分の環境(Intellijにvimプラグイン)とかだと、相手がemacs派だったりした場合とか…







あー、仕事でScala書きてー…

2013年3月10日日曜日

Intellij IDEA で少しだけPHPを書くのが楽になるかもしれない方法

去年末の75%offの際に Intellij IDEA 買いました。

いやもう凄い便利です、PHP書くときに… (´;ω;`)

ってことで本当は年初にでも書けばよかったんですけど…
かなり今更感ありますが取り敢えず書いとこ〜ってことで書きました。

あと今月から個人的にはもうPHPほとんど書く予定はない! はず…

Intellij IDEA で少しだけPHPを書くのが楽になる方法

IDE使うならやっぱりバリバリに補完が効くほうが良いですよね?

ということでPHPをIDEAで書くときに補完がよく効くようになる方法

結論

コメントを書く

具体的に

class Hoge
{
    /**
     * @return Fuga
     */
    public function createFuga()
    {
        return new Fuga();
    }
}

class Fuga
{
    /**
     * @var Piyo
     */
    private $piyo;
    
    public function __construct()
    {
        $this->piyo = new Piyo();
    }
    
    /**
     * @return Piyo
     */
    public function getPiyo()
    {
        return $this->piyo;
    }
    
}

class Piyo
{
...

みたいに書くだけ

そうすると下記のような状況で補完が効いて幸せになれます

$hoge = new Hoge();

// ここは別に何もしなくてもHogeのメソッドは補完の一覧に出てくる
$fuga = $hoge->createFuga();

// Hoge::createFuga に@returnコメントがないと
// 下記のようなコードを書く際に補完が効かない(getPiyoが一覧に出てこない)
$piyo = $fuga->getPiyo();

@return / @var 重要

Unitテスト書くときに少し幸せ

class HogeTest extends PHPUnit_Framework_TestCase
{
    public function testHoge()
    {
        $mock = $this->createMock();
        ...
    }
    
    /**
     * @return Hoge|PHPUnit_Framework_MockObject_MockObject
     */
    public function createMock()
    {
        return $this->getMock("Hoge", ...
    }
}

まあなんか上記の例は @depends を使ったほうが良いケースの場合もあると思うので書き方は臨機応変に…

1メソッドの中で、Mock作っちゃうとPHPUnit_Framework_MockObject_MockObjectとしてしか認識しないので、 当然Mock元のインスタンスメソッドとかは補完の対象として出てこないです。

上のようにあえて分離しといて@returnの内容を「|」で繋ぐと少し幸せになります

問題点

  • arrayとかの場合は全く幸せにならない
  • 幸せになるのはIntellij とか PHPStomeとかでPHP書く人だけっぽい
  • てか微妙に苦労するくらいなら端から別の言語で…

まさか「IDEAで楽したいから@return書け、絶対!」とか言えませんよね?

ってことでチーム内で強要(?)する場合は

  • PHPCS/MD に怒られないように丁寧にコード書こうね!
  • コメントはちゃんとココらへん見て書こうね!

とかすればいいんじゃないでしょうか。

まあゴミのような引き継ぎ案件でそれを途中から入れるのは無理だろうけど

なので新規なのにPHPを書かなければならない可哀想な方々、 導入時に静的解析ツールを入れましょう

まあ新規案件でPHPを選ぶとかあるのか…?