タグ

ブックマーク / ympbyc.hatenablog.com (8)

  • クラスの使い時 - 標高+1m

    TL;DR だいたいみんな知ってることだと思います。On Lispの「いつオブジェクトを使うのか」に言いたいことだいたい書いてあります。 背景 前にサーバーサイドMVCって記事で、クラスはせっかくモジュラーな関数をそうじゃなくするから基的に悪だってちろっと書いた。 でも最近Carrotの型チェッカをCLOS(のサブセット)を使って書き直した時に、主観的なコードのきれいさが劇的に向上したという経験をしていたり、PILOTの人と最近のPHPのOOP*1の話をしたりしてて、クラス、もしくは代数的データ型の使い時について、少なくとも自分が則るガイドラインを作りたいと思った。 この記事では、クラスを作るスタイルと、既存のデータ構造と関数を使うスタイルを対立させて考えます。オブジェクト指向と関数型の話ではなくて、例えばRubyでArrayとかHashをそのまま使うスタイルは後者です。関数型の人なら、

    クラスの使い時 - 標高+1m
    joan9
    joan9 2014/01/22
  • 普通のアプリケーションのコードに関数定義と関数適用とリテラル以外を書いてはいけない - 標高+1m

    underscore-fix とか Pastaとかを仕事で使ってみていたら、前から薄々感じていた事に確信を持った。 ライブラリが十分に強力なら、プログラム中に関数定義、関数適用とリテラル以外は出てこない。そして逆に、forやifやswitchやnewが必要になったら、その関数は一般化してライブラリに押しやらなくてはいけない。 On Lispだかなんだかのボトムアップデザインの説明で、「アプリケーションを書くための言語を作って、その言語でアプリケーションを書く」みたいな文章を読んだ記憶があるけど、この「言語」っていうのは、別にDSLである必要もLispマクロである必要もなくて、「ライブラリ」って意味と取って問題なくて、それならLisp以外の言語でもこの考え方は重要になる。自分のライブラリが十分に成熟するまでは、なにかアプリケーションを作る度にライブラリ関数を増やすつもりでやらなくちゃいけない

    普通のアプリケーションのコードに関数定義と関数適用とリテラル以外を書いてはいけない - 標高+1m
    joan9
    joan9 2014/01/21
  • ミスを減らす - 標高+1m

    毎日書く普通のコードでなるべくミスを減らし、デバッグを簡単にして、より多くの時間を楽しい事(キーボード叩いたり汎用関数作ったりリファクタしたり)に費やしたくて最近実践していることをメモします。一つ前の燃えてるエントリの補足(不変指向の利点の説明)も兼ねているので話があっちこっちぶれてしまいました。 順番への依存を減らす 「Xを実行してからYを実行するとおかしくなる」*1とか「Yを安全に実行する前には必ずZを実行しなければいけない」*2とかは絶対にミスるのでなるべくなくす。後者についてはラッパを作ってその中でアトミックに実行するとかで解決できるけど、前者はミュータブルなもの(オブジェクト)を使っている限り至る所で発現し、根的な解決は困難。以降のセクションで関数型の考え方を取り入れてこれを解決していきます。 状態を減らす 多くのプログラムは状態を持ちます。ある関数のようなものにプログラム中さ

    ミスを減らす - 標高+1m
    joan9
    joan9 2014/01/21
  • オブジェクト指向批判記事のフォーマルな補足 - 標高+1m

    おはようございます。会社でパーティーしてたら終電逃したのでせっかくだからと思って新宿から浦和まで歩いてみました。腰から下が死にそうです。 オブジェクト指向をちゃんと知った上でオブジェクト指向はクソだと声高に主張する人があと100人は必要  この記事ですが、正直ここまでバズるとは思っていませんでした。バズったのはよいことなので感涙に咽ぶ限りです。  その場の勢いで書いた物なので、記事文は自分から見てもお粗末な物です。記事中のリンク先や、コメント欄も含めて見てもらえると嬉しいです。  記事中抜けていた、関数型の考えを取り入れることの利点の一つは、ミスを減らすの記事に書きました。記事中で使われた曖昧な言葉については言葉整理で補足させて頂きました。併せてご覧ください。  ブコメやtwitterで、「適材適所」という言葉が散見されました。僕はこれには全面同意です。僕が主張しているのは、現状が適材適

    joan9
    joan9 2014/01/21
  • 存在しない記事 - 標高+1m

    ここにあった記事は消しました。 詳しくは以下: ympbyc.hatenablog.com

    存在しない記事 - 標高+1m
    joan9
    joan9 2014/01/21
  • 最近のPHPが割と良くてびっくりした - 標高+1m

    Disるのに忙しくて最近のPHP(5.4以降)のこと全然知りませんでした。 今日触る機会があったんですが見直しちゃいました。変なフレームワークさえ使わなければjsとかrubyよりまともに書ける気がする。 びっくりした点、良い点 タイプヒント。 型が合わなければこけてくれる。スカラー型も使えればもっと良かった 例外。PEARのライブラリも例外吐くようになってた。便利 なんか配列の書き方かっこよくなってる ネームスペース。嬉しい! クロージャのuse。明示的に外の変数を指定するのがとても良い。デフォルトが値渡しなのと併せて、命令的に書くには一手間かかるようになって、関数型っぽく書きやすくなる array_*系の充実した高階関数がクロージャが入って使いやすくなった。 "PHP 5はオブジェクト指向言語ではありません" Rocks!!!! これは昔からだけど、オブジェクト以外はデフォルトが値渡しな

    最近のPHPが割と良くてびっくりした - 標高+1m
    joan9
    joan9 2014/01/21
  • サーバーサイドMVC - 標高+1m

    まずクラスは使わない。なぜなら必要ないから。せっかくモジュラーな関数をわざわざそうじゃなくする意味がない。クラスはレアケースを除いて基的には悪。 モデルはRead系のAPIとWrite系のAPIで名前空間を分ける。 <?php /* Articles.php */ namespace Articles\Write; function mkArticle ($title, $text, $tags) { /*バリデーションとかして連想配列を作って返す*/ } function addArticle ($article) {/*DBに保存*/} namespace Articles\Read; function getArticles ($filter=null) {/*DBから読み出し*/} function getArticle ($id) {} ビューはモデルのRead系APIを直接見

    サーバーサイドMVC - 標高+1m
    joan9
    joan9 2014/01/21
  • こんな言語が欲しい - 標高+1m

    Carrotに静的型付けを実装していくうちに、あれを表現するには代数データ型が必要だ、あれにはシノニム、あれには型クラスなりインターフェースなりが必要、そうするとimplementsだかinstanceだかみたいなのも必要になるし、って結局どんどんHaskellに近づいていってて、冷静になって考えると僕が欲しかったのはこういうんじゃないんだと気づいた。 頭の整理のために要件をまとめてみる。 (済) 関数が基 主な理由 -> Real World Objects // Speaker Deck (済) シンタックス 文字列を書いているんじゃなくてデータを書いているような気分になるS式が好き。 構文は少なければ少ないほどいい。理想は関数定義と関数適用のみ。 マクロはそんなに好きじゃないんだけどユーザに開かれている仕組みなので許容範囲。 (済) 遅延評価でデフォルトでカリー化される Miran

    こんな言語が欲しい - 標高+1m
    joan9
    joan9 2014/01/21
  • 1