回答編集履歴
6
typo
test
CHANGED
@@ -46,7 +46,7 @@
|
|
46
46
|
|
47
47
|
|
48
48
|
|
49
|
-
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最
|
49
|
+
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|
50
50
|
|
51
51
|
|
52
52
|
|
5
修正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# PHP
|
1
|
+
# PHPの例
|
2
2
|
|
3
3
|
|
4
4
|
|
4
文字サイズ
test
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
+
# PHP
|
2
|
+
|
3
|
+
|
4
|
+
|
1
|
-
#####
|
5
|
+
##### 例1: mpyw/co
|
2
6
|
|
3
7
|
|
4
8
|
|
@@ -46,7 +50,7 @@
|
|
46
50
|
|
47
51
|
|
48
52
|
|
49
|
-
#####
|
53
|
+
##### 例2: guzzle/psr7 と slimphp/Slim
|
50
54
|
|
51
55
|
|
52
56
|
|
@@ -74,6 +78,10 @@
|
|
74
78
|
|
75
79
|
|
76
80
|
|
81
|
+
##### 例3: angular/angular
|
82
|
+
|
83
|
+
|
84
|
+
|
77
85
|
AngularJSのバージョン2.x系のソースが参考になると思います.
|
78
86
|
|
79
87
|
|
3
angular
test
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
##### PHPの例 (1)
|
2
|
+
|
3
|
+
|
4
|
+
|
1
5
|
実践的なプロジェクト…といえるかどうか微妙ですが(笑),自作しているライブラリでたまに継承は使用したりするので,その中でもコードが短くて読みやすい一例を紹介させていただきます.言語はPHPで,「限りなくJavaScriptのasync/awaitに近い非同期HTTPリクエスト処理が書ける」というのをモットーにしているライブラリです.
|
2
6
|
|
3
7
|
|
@@ -38,4 +42,52 @@
|
|
38
42
|
|
39
43
|
|
40
44
|
|
41
|
-
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|
45
|
+
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最k小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
##### PHPの例 (2)
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
PSR-7という仕様で決められたメッセージインタフェースの実装例ですが,こちらでは継承を全く使わずに**トレイト**を活用しています.
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
- [psr7/src at master · guzzle/psr7](https://github.com/guzzle/psr7/tree/master/src)
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
一方こちらはトレイトを使わずに**継承**でやってます.
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
- [Slim/Slim/Http at 3.x · slimphp/Slim](https://github.com/slimphp/Slim/tree/3.x/Slim/Http)
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
このように,同じインタフェースを実装する目的でも,2通りのやり方があります.慣れてくるとどっちを使ったほうがいいか何となくわかるようになります[要出典]
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
# TypeScriptの例
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
AngularJSのバージョン2.x系のソースが参考になると思います.
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
- [angular/modules/@angular/http/src at master · angular/angular](https://github.com/angular/angular/tree/master/modules/%40angular/http/src)
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
こちらはPHPの例で紹介したSlimのやり方と非常によく似ていますね.
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
2
補足
test
CHANGED
@@ -30,7 +30,7 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
-
自動スケジューラでは`add()`されたリクエストを全部即座にlibcurlに丸投げしていますが,手動スケジューラでは「一定数だけlibcurlに投げて(`addImmediate()`),上限を超えたぶんはPHP側で保持しておく(`addReserved()`)」というように振り分けており,内部的な動作が微妙に違います.
|
33
|
+
自動スケジューラでは`add()`されたリクエストを全部即座にlibcurlに丸投げしていますが,手動スケジューラでは「一定数だけlibcurlに投げて(`addImmediate()`),上限を超えたぶんはPHP側で保持しておく(`addReserved()`)」というように振り分けており,さらに何かリクエストが1つ終わるたびに1個ずつPHPで保持しておいたもの取り出してlibcurlに投げる(`interruptConsume()`)ことをやっています.このように,内部的な動作が微妙に違います.
|
34
34
|
|
35
35
|
|
36
36
|
|
1
補足
test
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
|
10
10
|
|
11
|
-
このライブラリは内部で有名なC言語製のlibcurlおよびそれのPHPバインディングを使っています.PHP7.0.7以降ではうまいことリクエストを集中させすぎないように抑制するオプションが設けられているのですが,7.0.6以前では存在していないため手動制御しています.双方に出来るだけラクに対応できるように,抽象クラスと継承を利用しています.
|
11
|
+
このライブラリは内部で有名なC言語製のlibcurlおよびそれのPHPバインディングを使っています.PHP7.0.7以降ではうまいことリクエストを集中させすぎないように抑制するオプションが設けられているのですが,7.0.6以前では存在していないため手動制御しています.双方に出来るだけラクに対応できるように,**抽象クラス**と継承を利用しています.
|
12
12
|
|
13
13
|
|
14
14
|
|
@@ -34,4 +34,8 @@
|
|
34
34
|
|
35
35
|
|
36
36
|
|
37
|
-
但しクラスが独自に持っているものはprivateに過ぎず,継承を抽象クラスから強制されたものはすべてprotectedかpublicになっており,それを呼び出す側からはどちらも同じAbstractSchedulerとして扱える点がミソです.Pool.phpでは3行だけでこの場合分けが済んでおり,中身がどちらになっているかを全く意識する必要がありません.
|
37
|
+
但しクラスが独自に持っているものはprivateに過ぎず,継承を抽象クラスから強制されたものはすべてprotectedかpublicになっており,それを**呼び出す側からはどちらも同じAbstractSchedulerとして扱える**点がミソです.Pool.phpでは3行だけでこの場合分けが済んでおり,中身がどちらになっているかを全く意識する必要がありません.
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|