tech::hexagram

personal note for technical issue.

【随時更新】技術研修の落穂拾いをしてみる

ご無沙汰してます。
最近会社では技術研修のほうが着々と進んでいまして、だんだん課題が溜まってきています。。
また、理解があやふやな部分もちらほらあるので、ここで一旦整理しておこうかなぁと思います。

チラ裏ですみません。

クロージャとオブジェクトの違い

クロージャとは
  • 関数が作成されるときの環境(定義個所から見えるローカルな束縛*)を「閉じ込んで」いるもの。関数とそれを評価する環境のペアであるともいえる。プログラム内で環境を共有するための仕組みである。
function newCounter() {
    var i = 0;
    return function() { // 無名関数
        i = i + 1;
        return i;
    }
}
 
c1 = newCounter();
alert(c1()); // 1
alert(c1()); // 2
alert(c1()); // 3
alert(c1()); // 4
alert(c1()); // 5
オブジェクトとは
  • 文字列や配列といった参照型のデータを、 まとめて「オブジェクト」と呼ぶ。

JavaScript

prototypeとは
  • クラス内にメンバ関数を作っておくと、new するたびに同じ関数がオブジェクトごとに生成されてしまう。
 プロトタイプの実体は、コンストラクタ関数が持つprototypeプロパティ
 同じコンストラクタを持つオブジェクト間で共有される
 オブジェクトのメンバを参照すると、「オブジェクト→オブジェクトのプロトタイプ」の順で検索される
function Person(name) {
  this.name = name;
}
Person.prototype.hello = function() {
  alert("こんにちは。私の名前は" + this.name + "です。");
};

優先度:オブジェクトのメンバは、オブジェクト→プロトタイプの順に検索される。

innerTextとinnerHTML
  • innerText:タグの中身のテキストのみを参照・変更できる
  • innerHTML:タグの中身のタグを含んだテキストを参照・変更できる
<div id="str">このタグの中身を書き換えます。</div>
document.getElementById("str").innerText="テキストの書換え";
document.getElementById("str").innerHTML="<b>タグ</b>を含む書換え";
getElementByIdとgetElementsByName
  • getElementById:id 属性で指定した名前で要素を参照する。HTML要素(単体)を取得。
  • getElementsByName:name属性で指定した名前で要素リストを参照する。HTML要素(リスト)を取得。

単語系の知識

  • ダックタイピング:同じインタフェースさえ備えていれば型は何でも構わない、という考え方に基づく多態 (polymorphism) の手法。継承関係を無視して多態的にオブジェクトのメソッドを呼び出せる。
class Duck
  def quack; puts "gaaa"; end
end

class Foo
  def quack; puts "...."; end
end

def func(ducky)
  ducky.quack
end

duck = Duck.new
foo = Foo.new
func(duck)
func(foo)

func に Duck と Foo のどちらのオブジェクトを渡しても正常に動作する。これは Duck, Foo ともに、共通のインタフェースを持つ quack メソッドを備えているからである。

パラメトリック多態(多相)

Haskell は、静的に (=コンパイル時に) 型チェックするが、型が違うだけで実装が共通化できることがよくある。こういうとき、型をパラメータとするが、このような多態をパラメータ多相 (parametric polymorphism) という。

ブレースホルダ

  • 静的ブレースホルダ:Prepared Statementと定義されている。SELECT * FROM USERS WHERE ID = ?などでSQL文を定義し、クエリー発行段階で?の部分にパラメータを指定できる。プレースホルダのままの SQL 文をデータベースエンジン側にあらかじめ送信して、実行前にSQL 文の構文解析などの準備をしておくことを指す。SQLインジェクションは発生しない。
  • 動的ブレースホルダ:静的ブレースホルダでDBエンジン側で行なっていたパラメータのバインド処理をアプリケーション側のライブラリ内で実行する。バインド処理を実現するライブラリによっては、SQL 構文を変化させるような SQL インジェクションを許してしまう、脆弱な実装のものが存在する可能性を否定できない。

継承と委譲

  • 継承
    • あるオブジェクトが他のオブジェクトの特性を引き継ぐこと。
class Base
{
public:
    int n;
};
//仮想継承
class D1 : public virtual Base { /* 〜 */ };
class D2 : public virtual Base { /* 〜 */ };
 
class Derivation : public D1, public D2 { /* 〜 */ };
<||
Template Methodパターンは継承を元にしたソフトウェアデザインパターンである。親クラスの制作者は、将来作られるであろう子クラスをおおよそ想定して、子クラスでオーバーライドできる抽象メソッドを用意しておく。

- 委譲
-- オブジェクト指向プログラミングにおいて、あるオブジェクトの操作を一部他のオブジェクトに代替させる手法のこと。
>|java|
class A {
    public void foo() {
        System.out.println("A.foo() is called.");
    }
}

class B {
    private A a = new A();
    public void bar() {
        a.foo();
    }
}

Strategyパターンは委譲を元にしたソフトウェアデザインパターンである。委譲によって処理を分けた方が、クラス設計を説明しやすいという利点がある。

Template Methodパターンを使うかStrategyパターンを使うかは、子クラスごとに異なる処理が、単独でも意味のあるものかどうか、で決めればよい。