The Dabsong Conshirtoe

技術系の話を主にします。

ぼくのかんがえたさいきょうのひろしまとうようかーぷ

まずはじめに僕は中日ファンです。


でも、広島にはすごい選手がたくさんいたと思います。
ということで、広島歴代最強の打線を組んでみます。

1. 高橋慶彦(遊)
2. 正田耕三(二)
3. 緒方孝市(右)
4. 山本浩二(中)
5. 前田智徳(左)
6. 水谷実雄(一)
7. 江藤智(三)
8. 西山秀二(捕)
9. 外木場義郎(投)

かなりの重量打線でありがながら、走れる守れる選手が多い。すげーなこれ。
江藤・西山は盗塁がうまかったイメージがある。

野手は他にも衣笠祥雄、野村謙二郎笘篠賢治金本知憲小早川毅彦、ディアス、ロペス、ランスなど好選手が多い。ディアス好きだったなぁ。
投手でも北別府、大野、佐々岡、津田などなど。

プロフェッショナルってなんだろう

DevLoveのAdvent Calendar2012で「プロフェッショナル」をテーマにしたブログを皆さん書いておられるので、僕も良い機会だしプロフェッショナルとは何か、ということについて自分なりに考えてみました。

http://devloveblog.wordpress.com/professional-advent-calendar/

僕の見たプロフェッショナル

プロフェッショナルってなんだろう?って考えてみてもあんまり思い浮かばなかったので、具体像を参考にすることにしてみました。

すぐに思いついたのが高校の時の国語のT先生。T先生は、生徒たちを希望の大学に入れるという教師としての「成果」と、生徒たちに自ら考えるクセを付けるという教師としての「信念」を両立させていました。

かなりアクの強い先生で、「市販の参考書はロクな物がない」と言って自ら参考書を何冊も作ったりしていました。

そういった受験熱心な面がある一方、生徒に考えさせることも巧みに行なっていたと感じます。現代文や古文の授業で、問題集にあるような答えがはっきりしている問題だけではなく、答えがないような問題を生徒に問い、答えさせていました。バッサリ切ってしまうことも多かったけど、僕はT先生に認められたいがために考えるようになりました。動機は不純だけど、結果的に、「考えることの大切さ」というかけがえないものを頂いので感謝しています。

周りにも、T先生に影響を受けた生徒は多く、他校にもT先生を師事する先生が少なからずいたようです。

プロフェッショナルとは何か

このT先生の思い出から考えると、「プロフェッショナル」とは、組織存続のために必要な明確な「成果」と、自らが成し遂げたいと思う「信念」の両方を実現させることができる人だろうと思います。

エンジニアで言えば、生活資金をしっかりと稼ぎながら、自らが持つエンジニアとしての信念を貫くことになるでしょう。

オープンソース活動も素晴らしいけどそれだけやって自らや家族を養えないのならそれはプロフェッショナルとはちょっと違うし、生活資金を稼げていてもその仕事を通じて実現したい信念も何もなく、ただ目の前のタスクを片付けているのもプロフェッショナルとは呼べないでしょう。

自分はどうか

僕もエンジニアの端くれとして、せめて自らの思うプロフェッショナルでありたいと思っています。

ちなみに僕の信念は、「美しさを大切にする」こと。美しさとはシンプルさのこと。コードも文章も仕事の仕方も、誰が見てもわかりやすく気持ちの良いものでありたいと思います。

この「美しさ」に対するこだわりは、他人のためという理由も勿論ありますが、それ以上に「自分がそうしたいから」というのが強いです。ただ、「なぜそうしたいのか?」と問われれば、「そうするのが気持ち良いから」としか言いようがありません。はっきりしてないことって嫌いなんです。

結論

「プロフェッショナル」とは、成果と信念の両方を実現する人。

なんかありきたりな感じになっちゃいましたけど、自分の体験を元に自分で考えた結果だから良いかな。

javascriptでのコード再利用パターン

javascriptでのコード再利用パターンについて最近検討してました。

というか、それまでjsでそれなりに大きなコード書くときも共通部分は関数に分解して、くらいしかしてなかったのですが、プログラムが大きくなるとメンテナンスがきつくなってくるので、普段pythonで書いてるみたいに責務をオブジェクトに分解して特化したい部分は継承する、とかして管理したいなと思いまして。


クラスのような仕組みを構築する

javascriptにはクラスやインスタンスといった概念がないので、シミュレートしてみます。

// 継承をサポートしたいオブジェクトはこのクラスを継承する
var BaseObject = (function() {
  var Base = function() {
    // インスタンス生成時はinitが呼ばれる
    this.init.apply(this, arguments);
    Base.prototype.init = function(){};
  };

  // 継承を行う内部関数
  var inherits = function(parent, props) {
    var child = function() {
      parent.apply(this, arguments);
    };

    var F = function(){};
    F.prototype = parent.prototype;
    child.prototype = new F();

    // オーバーライドするプロパティ
    if (props) {
      for (var key in props) {
        if (props.hasOwnProperty(key)) {
            child.prototype[key] = props[key];
        }
      }
    }
    child.prototype.constructor = child;
    // _super に親への参照を持たせる
    child.prototype._super = parent.prototype;

    return child;
  };

  // 継承関数
  Base.extend = function(protoProps) {
    var child = inherits(this, protoProps);
    child.extend = this.extend;
    return child;
  };

  return Base;
}());

// 親クラス
var Parent = BaseObject.extend({
  init : function(name, age) {
    this.name = name;
    this.age = age;
  },
  say : function() {
    return "I am " + this.name;
  }
});

// 子クラス
var Child = Parent.extend({
  init: function(name, age) {
    this._super.init.call(this, name);
    this.age = age;
  },
  say: function() {
    return this._super.say.call(this) + ", age is " + this.age;
  }
});

// 親クラスのインスタンス生成
var parent = new Parent("parent", 50);
// 子クラスのインスタンス生成
var child = new Child("child", 20);

console.log(parent.say());
"I am parent"
console.log(child.say());
"I am child, age is 20"

長い!!

自分で継承機構を作っているので仕方ないですね。

ParentやChildがクラスで、そのクラスをnewして作っているparentやchildがインスタンスとなります。

extendはクラス継承をシミュレートする関数です。引数に子クラスで定義したいメソッド等をオブジェクトととして渡します。

initはnewしたときに呼ばれる初期化処理です。

インスタンス生成時にnewを忘れると、コンストラクタ内のthisがグローバルオブジェクトを指すので大変なことになります。

ただ、BaseObject生成部分を抜きにして考えれば、クラス定義とインスタンスが明確にわかれているのでそこまで問題にはならないかな。

// BaseObject生成箇所を抜いてみる
// 親クラス
var Parent = BaseObject.extend({
  init : function(name, age) {
    this.name = name;
    this.age = age;
  },
  say : function() {
    return "I am " + this.name;
  }
});

// 子クラス
var Child = Parent.extend({
  init: function(name, age) {
    this._super.init.call(this, name);
    this.age = age;
  },
  say: function() {
    return this._super.say.call(this) + ", age is " + this.age;
  }
});

// 親クラスのインスタンス生成
var parent = new Parent("parent", 50);
// 子クラスのインスタンス生成
var child = new Child("child", 20);

クラスとインスタンスの区別が明確なのは、クラスベースOOPに慣れ親しんでいる人にとっては分かりやすいのではないでしょうか。

継承関数は一度書いてしまえば使いまわせますしね。

newはオライリーのGood Parts本はじめdisられる傾向にありますが、クラスとインスタンスが明確ならnewを忘れることは無さそうですし、忘れたらオブジェクトがundefinedとなるのですぐ気づくような気がします。

みなさんどうしてるのだろう?

ネタ元

この記事はオライリーの「JavaScriptパターン」の6章「コード再利用のパターン」を参考にしています。 また、backbone.jsのコードも参考にしています。

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス