「契約プログラミング」を含む日記 RSS

はてなキーワード: 契約プログラミングとは

2013-04-01

PHP13.4.1の新機能

PHP最新版がようやく正式に発表されましたね。新機能等について調べてみたので流行に敏感な人はぜひ今のうちから勉強しておきましょう。

下位互換性のない変更点

  • 「?>」の廃止

「?>」を積極的に使うことにより、余計なホワイトスペースを混入させてしまう問題がありました。

これは厄介で非常に根が深い問題でしたが、ようやく根本解決として廃止されました。素晴らしいですね。

今後「?>」を使うとコンパイルエラーとなるので注意が必要です。

機能

abstract文で囲うとそのコード自動抽象化します。

昨今抽象化抽象化特に意味もわから言葉だけ連呼する人間が増えてきました。しかし新PHP時代における抽象化はもはや人間が理解しなくてもできるようになります

$class = abstract {
    $人間 = array('name' => 'yamada', 'age' => 20);
    $佐藤 = array('age' => 20);
    $動物->name = '花子';
    $動物->type = '犬';
    
    function move ($a) {
        $a->position++;
    }
};

$class->move();

このような処理が、自動抽象化され再利用できるようになります。もちろんクラス抽象化だけでなく、手続きやデータ構造であっても適切に自動抽象化されます

またcatch文を繋げる事で抽象化に失敗した場合を検出することが可能です。

  • 強力な型チェック

php実行時オプションに強力な型チェックオプション(-compile)が追加されました。

$ php -compile example.php

そのスクリプトにおける全ての処理パターンを実行し、全ての型のチェックを自動で行います。その際、外部に影響を与えるような処理(ファイルへの保存等)は型チェックのみを行い無視されます

この強力な機能のおかげでもはや静的言語の利点といわれていたコンパイル時の型チェックを軽く超えました。

動的言語でありながら、考えられる全ての型の引数、例外系を全ての関数の組み合わせで網羅的にチェックします(しかもチェック時間は長くても0.数秒という驚異的なチェック能力です!)

これが今回の目玉機能でしょう。

theworld文で囲うとその間の時間が止まります

theworld {
    // 止まった時間の中を動けるのは$dioだけ
    $dio->foo();
    $dio->bar();
};

$dioという特殊変数が用意されているのでその変数を使って処理をすることができます

用途としては非常に重たい処理をさせるのがいいでしょう。実時間0秒で実行することが可能となります

ただし9秒までしか止められないので注意が必要です。ですが回避策として以下のようにすれば追加で5秒止めることも可能です。

theworld {
    $dio->foo();
    $dio->bar();
}
starplatinum {
    // 9秒過ぎた時点でこちらへ
    $jotaro->foo();
};


PHP 13.4.x で推奨されなくなる機能

名前空間(namespace)が非推奨になりました。これを使用するとE_NAMESPACE_YEN_ARIEHENという警告が発生します。

非推奨となった理由ですが明確にはされていません。大人の事情ってやつでしょう。

ただ噂レベルでは、やはりというか区切り文字の「\」がありえへんという声が多かったからではないか?と一部囁かれています

mandomキーワードが非推奨になりました。mandomはきっかり6秒戻すという機能ですが、逆に言うと6秒きっかしか戻せないので扱いづらいという問題がありました。

また以下のような処理を書いた場合に$flagバグ等で常に真になるケースにおいて無限ループとなり、非常に危険だという問題もあります

// 何かしらの処理・・・

if ( $flag ) {
    mandom;
}

このようにPHP初心者がmandom使って無限ループをさせてしまう事案が後を絶たず、なかなか現実時間が進まないという問題が発生したため、廃止予定となります

新しい関数

Google検索したコード小片取得し、実行させる関数

$mail = google_search_exec("メール送信するやつ",2);
$mail("user@example.com");

例えばこれだけでメール送信できるようになります

第一引数検索ワード。PHPというワードは自動で含まれるので指定する必要はありません。

第二引数検索結果一覧の指定位置。2だと上から二つ目検索結果のURLコード小片を使うという意味になります

また第三引数にはコールバック関数を指定することによりコード小片にフィルターをかけることも可能です。

このような処理がたった2行で書けるというのがPHPの利点ですね。

日本語名の関数が新たに追加されました。これは非常に便利な関数です。

$code = 写経("
$a = 1 + 2;
print $a;
");

引数に与えられたコード片を写経します。戻り値写経結果が返ってくるのでそれを利用するだけです。簡単ですね。

サッケード発生中における自動補完のための関数です。

この関数が呼ばれると一瞬処理が止まったように見えますが、実際には自動補完で動作が完了している状態になります

for($i=0;$i<10000;$i++) {
    if ( $i % 2 == 0 ) {
        chronostasis();
    }
    
    // 何かしらの処理・・・
}

素晴らしい機能ですね。今後はこれ無しじゃプログラムできなさそうです。

PCが爆発します。

用途ですが、言わずもがな流行の真契約プログラミング用ですね。アサートの代わりに使うとよいです。

function foo ($a) {
    pc_explosion(!is_null($a),'$aはNULLはダメー!');
    
    // 何かしらの処理・・・
}

テストコードを実行する場合PCの周囲に人が居ないか気をつけてから実行させましょう。




というわけで新しい機能てんこ盛りでしたね。

個人的に良いなと思ったのはpc_explosion関数ですかね。約束事を守らないプログラマーなんぞ爆死しちゃえばいいんです。僕を含めて(お

2013-03-27

プログラミングの初級になるためにの目次

http://anond.hatelabo.jp/20130325172822 の続き

言語Java7を想定。(Java8が迫っていますが、Lambdaなど関数型は、まだ早いと言うことで)

定理由は、C++比較して学べるところが大きく、安全シンプル言語から

※いきなりJavascriptはやめとけ、PHPは論外。

RubyScalaでないのは、筆者が初心者には適切には教えられないから。

おもちゃToyとしてjQueryで遊ぶのは、悪くは無いと思う。

0.はじめに

これ以降は名著の紹介や学習方法の紹介が主体となります。名著のコンポジションという形が時間限界ですね。

量については「初級になるなら、専門書を計3,000ページは修得することは覚悟してね」なんて言ったりしています

Javaで初級のわかりやすい指標ですと、[amazon:Effective Java]とGoFまでの修得。

初級になるまでに登竜門への挑戦期間を含めて、3~4年はかかっても仕方が無いとも思います

※逆に「一山いくらのコーダー」というのは、Effctive JavaGoFが達成している技術も知らずに「自分Javaプログラマー」だと誤解してしまっているような人達です。

そういったコーダーは何年経とうとも初級プログラマーにすら敵いません。

初級を目指して、プログラミングを楽しんでください。

ただ、学ぶべきことはべらぼうですが、「各分野毎に、エレガントな方法がある。だから探して修得する」ということが大切です。

※「一を聞いて十を知る」ような優秀な人に、50冊くらいドーンと本を置いてあげて、各本の目次を読ませるだけで、

底の見え無さを悟ってくれたりすると、嬉しくなってしまます

※余談ですが、その底の見え無さは数学という学問のものですね。例えば、関数型言語の底流に「圏論」というここ100年の最新の数学があります

また中級くらいで、Liskovの置換原則などが載っている本を紹介しますが、

そのLiskovの置換原則の周辺で出てくるcovariant(共変)って、圏論という数学概念だったりします。

数学出身としては、数学現実に活かされている嬉しい事例です。

閑話休題

1.目次

1)エディター・コマンドライン正規表現友達

「速く正確に大量の出力」という能力は、プログラミングをする上でも、ドキュメントを書く上でも、何より「つまら仕事」の時間圧縮ができるようになるため、重要です。

スローガンとしては「思考のスピードで出力することを目指そう」です。

紹介するエディターはemacsvimExcelです。ついでにIMEとしてATOKを使用しているため、ATOK操作Emacsライクにする話も紹介します。

ExcelWindows環境Meadowすら入れさせてくれない場合最後の砦という扱いです。

コマンドラインは、「コマンドラインというものがある」「時として非常に強力である」程度の紹介です。

※筆者はzsh全然使えません。使いこなしている方々と接する度に「勉強しなきゃな~、でも、あっちの方を先にやりたい・・・」とグズグズして、はや何年・・・

正規表現は置換を用いて、テキストの一括編集重要です。後、遭遇したくない事態ですが、スパゲッティコードの解析をする上での最後の砦です。

※遭遇したくない例

ん?何か変なところで副作用のある処理があるようだなぁ(消沈)、SQLのInsertかUpdateか一応Mergeも使っているところから逆算して原因箇所を探すか・・・(諦念)

この糞コードがっ!!こんなところに書くんじゃねぇ!!(憤怒激高)

(ここで、他にやらかしていそうな似たようなコード正規表現grep検索。改行コード込みにすれば複数文検索も可能)

わはは、予想通り共通化すべきロジックメソッドがそこら中にある・・・

2)アルゴリズムに始まりアルゴリズムに終わる(データ構造アルゴリズムの一部という認識言葉を使っています)

入門編で一つLinkedListというアルゴリズムを学びました。

少なくとも一つ本を読みながら自力でアルゴリズムを学べる人なら、大成できる可能性があります

前に紹介した[amazon:C++実践プログラミング]には、LikedListやStackなど基本的なアルゴリズムが載っておりますが、

これに加えて、初級になるためにはこれくらいは知っておいて欲しいというものを紹介します。

※後、最初から必ずしも手を出さなくても良い上限も紹介いたします。

3)正・不正の定式化・自動テスト・ロギング・アサーション・例外・契約プログラミング

プログラムは、データ入力して、加工して出力・保存する処理の繰り返しです。

まり、各一連の繰り返し毎に、「正しい入力」「正しい出力」を定式化する必要があります

それを人間の手では無くコンピューターやらせられるように、つまり自動テストできるようにテストプログラミングします。

そこで処理の進捗を確認するためにロギングし、処理が想定通りであるかをアサーションでチェックし、

不正入力不正な出力=例外が起きたら、対処策をプログラミングします。

(ex 途中で処理を中断して、入力者に適切な入力メッセージを伝えてあげる。入力自動補正などもあり得る)

で、ここら辺をまとめてどうあるべきかとして「契約プログラミング」があります

※余談。定式化・テストに際して、数学畑の人間としては、Javaだとequalsのオーバーライドでも必要になるし、同値関係同値分割だけでなく、集合論群論から学んで欲しい・・・(ここいらは数学科学部1~2年の学習内容)

4)名著を読め、新たな名著を探せるようになれ・素晴らしい人を見つけたら、縁を大切に

名著は英語で読みましょう。名著が名著たる由縁は、度々引用されることにあります

まり最新の技術書を読むときに、引用された名著のフレーズが、新旧のリンクをなし、理解の助けになります

対話は学問をする上で非常に重要です。

壁打ちといって、独り言で思考補助をするよりも遙かに有益です。

※素晴らしい師匠を探すなら、大学行くのが一番ですが、見聞を広げていく中で出会いを待つしかないとも思います

5)オブジェクト指向とはなんぞやとGoFデザインパターン + マルチスレッドプログラミング

マルチスレッドが難しいのは「バグを起こしにくいプログラミング」を求められるから

まりTry and Errorからの決別が求められ、今後の仕様変更拡張も踏まえて慎重に慎重にデザインする必要があります

できる限りステータス変数を持たずに安全に、でもマルチスレッドにするのだから効率を追求しなければ本末転倒

でも効率のためにはメモ化に代表されるキャッシング必須と、アンビバレンツな要素のバランス取りが難しい。

このために、リエントラントな実装・抽象と実装の分離など様々なエッセンスを駆使することが必要です。

床屋哲学者問題

6)日々コツコツと

というよりも孔子曰く、知っているよりも好きであること。好きであることよりも楽しめることのほうが強く、

気づいたら日々時間が許す限りプログラミングをしてしまうのが理想です。

仕事として嫌々スキルを磨かなきゃということが、これほど不幸な職業も無いですね。

余談 FizzBuzz写経について

FizzBuzz」は、本来の目的通り、協力会社の選定の際の足切りには便利ですが、

学習の達成度を測るには、簡単すぎる不適切な問題ですね。

写経

数学畑の人間として言わしてもらうと、

写経数学証明問題を、教科書テンプレ通りに、数値や名称だけ変えて記述することしか出来ない人の発想。

まり矛盾無く一貫した論理モデル」の構築が自由に出来ず、テンプレの微修正しか出来ない人の発想。

また、外部の「矛盾無く一貫した論理モデル」の吸収が不自由で、アルゴリズムを「手順」としてしか捉えられないように見受けられる。

プログラマーとしての大成は見込めないと思う。

数学畑として提供できる試金石

連続であること確かめるための「ε-Δ論法」(数学科学部1年の学習内容)

事前知識無く、このモデルを理解できる人は、十分に「矛盾無く一貫した論理モデル」を構築できる人。

1.まず「連続」とは何ぞやと考えて概念を膨らませてください。

2.十分思考できたと思えたら、Wikiあたりでイプシロン デルタ論法を見てください。

2013-03-08

[]開発の手順

1. そうなって欲しいこと・願望・コンセプトを得る。得ようと思っても得られない。ここは偶然起こること。

2. 何をするか・What・思い付きを挙げる。ブレインストーミング

3. どうやるか・How・方法を考える。「できそう」という段階まで。

4. 必要もの・使える技術前例を集める。他人を説得できるようになる。

5. 機能クラスといった実装上の分割、役割分担など行動に移すための細分化と割り当てを行なう

6. 各機能・各クラスでやることを列挙する。

7. やること別に「そのためにやらなければならないこと」を実行順通りに書き下す。擬似言語擬似コード

8. 擬似言語設計→擬似言語フィードバック設計と擬似言語→実装

コラム ── アサーションについて】

擬似コードを書くならアサーションも一緒に書く。不要な用語や用語の重複があるとうまくアサーションを書けない(かみ合わない)。用語の最適化変数コード最適化でもある。

事前条件→事後条件をアサーションで表明、事後条件→他の事前条件へ連鎖契約によるプログラミング契約プログラミング

擬似言語でのアサーションはそのままプログラムコードでもアサーションになるか、テストコードになるか、メソッド|関数|手続きのパラメーター・戻り値コメントになる。アサーションは「実行可能なコメント」(Executable Comments)とも呼ばれている。

9. あとはセンス

RIGHT:[[:t/Prog]]

----

CC0

 
ログイン ユーザー登録
ようこそ ゲスト さん