5年以上前の自分はVBScript/ASPでちょっとしたツール作っていたことがあるのですがDB上のレコード1つ1つという単位でモノゴトを捉えていました。
そのため、配列とかDictionaryオブジェクト(ハッシュ)の使い道が全然わからなくって
「これはいったいどういう場合に使うんだろう」
って長年疑問に思いながらも、まぁ困ることないからそのままでもいいかーと思っていました。
その後、今の仕事をするようになって、多少開発の経験があるとはいえ、基本的にはそちらの分野は馴染みが無いけど、転職相談の面談でそういう人たとと接する機会が増えたから、本格的にプログラミングの勉強をするようになって、Ruby、JavaScript(JScript)(あとはちょっとだけだけど、Perl/Python )で色々とコード書いているうちに徐々に配列なんかの使い道がわかるようになりました。
自分が面談対応した人の進捗状況の確認をリアルタイムにするために、DBからデータ抽出して加工するなんていう場合にも以前の考え方とは違って
対応した人をまずは全員抽出
↓
自分以外の人が対応したけど結構スキル高くチェックしておきたい人も含める
↓
すでに他社で仕事決まってもうチェックしなくても良いからそれは除く
という感じで考えることが出来るようになったので、こんな感じのJavaScript(JScript)のコードを最近は書けるようになりました。
var Counselor = function(counselorcd){ this.mystaff = [ // ]; this.favoritelist = [ // ]; this.excludelist = [ // ]; }; Counselor.prototype = { getMyStaff:function(output){ var _result = []; var staff = ""; try{ this.mystaff.each(function(obj){ staff = new Staff(obj.name, obj.cd); if(output=='html'){ _result.push("<tr>\n" + staff.makeTableData() + "\n</tr>"); } else { _result.push("[" + staff.makeJSONData() + "],"); } }); }catch(e){ WScript.Echo("can't create Staff object"); } return _result.join('\n'); }, /* 省略 */ mergeList:function(){ var _mystaff = this.mystaff.map(function(staff){ return staff.cd; }); var _mystaff_with_favoritelist = this.union(_mystaff,this.favoritelist); return this.difference(_mystaff_with_white,this.excludelist); }, /* 配列の集合演算を行うユーテリティーメソッド 下記ソースを参考 http://blog.kaihatsubu.com/archives/001498.html */ include:function(item, target) { for (var i = 0, len = target.length; i < len; i++) { if (item == target[i]) { return true; } } return false; },//include union:function(arrayA, arrayB) { var result = arrayA.concat(); for (var i = 0, len = arrayB.length; i < len; i++) { if (!this.include(arrayB[i], result)) { result.push(arrayB[i]); } } return result; },//union difference:function(arrayA, arrayB) { var result = []; for (var i = 0, len = arrayA.length; i < len; i++) { if (!this.include(arrayA[i], arrayB)) { result.push(arrayA[i]); } } return result; },//difference intersection:function(arrayA, arrayB) { var result = []; for (var i = 0, len = arrayB.length; i < len; i++) { if (this.include(arrayB[i], arrayA)) { result.push(arrayB[i]); } } return result; }//intersection };
「配列の集合演算」なんていう言葉が出てくるとは、数年分の自分では想像つかなかったけど最近はこういう思考が自然と出来るようになりましたが最近Scala的な考え方 - Scalaがとっつきにくいと思っている人へというエントリで
Lisperは、リストをどう作るかをまず考えるらしいです。適切なリストが出来たら、プログラムはもうできたも同然だと。同じ考え方は、Scalaでも通用すると思います。
大まかに、こんな流れで考えてます。(リストは最初から与えられることもあるでしょう)
「(A)リストを作る」
→「(B)合成したり、条件に合わせて絞り込む」
→「(C)個々の要素を加工する」
→「(D)個々の要素を利用した操作を行う」
と書かれていましたが、データを大きな塊として捉えて、それを合成したり、絞り込んだりっていう考え方が自分も身に付いてきたからこのエントリで書かれていることはそんなに違和感を感じることもなく、35歳をとっくに過ぎて、37歳1ヶ月になった自分でも理解できました