回答編集履歴
6
typo
answer
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
但しクラスが独自に持っているものはprivateに過ぎず,継承を抽象クラスから強制されたものはすべてprotectedかpublicになっており,それを**呼び出す側からはどちらも同じAbstractSchedulerとして扱える**点がミソです.Pool.phpでは3行だけでこの場合分けが済んでおり,中身がどちらになっているかを全く意識する必要がありません.
|
24
24
|
|
25
|
-
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最
|
25
|
+
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|
26
26
|
|
27
27
|
##### 例2: guzzle/psr7 と slimphp/Slim
|
28
28
|
|
5
修正
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# PHP
|
1
|
+
# PHPの例
|
2
2
|
|
3
3
|
##### 例1: mpyw/co
|
4
4
|
|
4
文字サイズ
answer
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# PHP
|
2
2
|
|
3
|
+
##### 例1: mpyw/co
|
4
|
+
|
3
5
|
実践的なプロジェクト…といえるかどうか微妙ですが(笑),自作しているライブラリでたまに継承は使用したりするので,その中でもコードが短くて読みやすい一例を紹介させていただきます.言語はPHPで,「限りなくJavaScriptのasync/awaitに近い非同期HTTPリクエスト処理が書ける」というのをモットーにしているライブラリです.
|
4
6
|
|
5
7
|
- [mpyw/co: Asynchronous cURL executor simply based on resource and Generator.](https://github.com/mpyw/co)
|
@@ -22,7 +24,7 @@
|
|
22
24
|
|
23
25
|
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最k小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|
24
26
|
|
25
|
-
#####
|
27
|
+
##### 例2: guzzle/psr7 と slimphp/Slim
|
26
28
|
|
27
29
|
PSR-7という仕様で決められたメッセージインタフェースの実装例ですが,こちらでは継承を全く使わずに**トレイト**を活用しています.
|
28
30
|
|
@@ -36,6 +38,8 @@
|
|
36
38
|
|
37
39
|
# TypeScriptの例
|
38
40
|
|
41
|
+
##### 例3: angular/angular
|
42
|
+
|
39
43
|
AngularJSのバージョン2.x系のソースが参考になると思います.
|
40
44
|
|
41
45
|
- [angular/modules/@angular/http/src at master · angular/angular](https://github.com/angular/angular/tree/master/modules/%40angular/http/src)
|
3
angular
answer
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
##### PHPの例 (1)
|
2
|
+
|
1
3
|
実践的なプロジェクト…といえるかどうか微妙ですが(笑),自作しているライブラリでたまに継承は使用したりするので,その中でもコードが短くて読みやすい一例を紹介させていただきます.言語はPHPで,「限りなくJavaScriptのasync/awaitに近い非同期HTTPリクエスト処理が書ける」というのをモットーにしているライブラリです.
|
2
4
|
|
3
5
|
- [mpyw/co: Asynchronous cURL executor simply based on resource and Generator.](https://github.com/mpyw/co)
|
@@ -18,4 +20,27 @@
|
|
18
20
|
|
19
21
|
但しクラスが独自に持っているものはprivateに過ぎず,継承を抽象クラスから強制されたものはすべてprotectedかpublicになっており,それを**呼び出す側からはどちらも同じAbstractSchedulerとして扱える**点がミソです.Pool.phpでは3行だけでこの場合分けが済んでおり,中身がどちらになっているかを全く意識する必要がありません.
|
20
22
|
|
21
|
-
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|
23
|
+
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最k小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|
24
|
+
|
25
|
+
##### PHPの例 (2)
|
26
|
+
|
27
|
+
PSR-7という仕様で決められたメッセージインタフェースの実装例ですが,こちらでは継承を全く使わずに**トレイト**を活用しています.
|
28
|
+
|
29
|
+
- [psr7/src at master · guzzle/psr7](https://github.com/guzzle/psr7/tree/master/src)
|
30
|
+
|
31
|
+
一方こちらはトレイトを使わずに**継承**でやってます.
|
32
|
+
|
33
|
+
- [Slim/Slim/Http at 3.x · slimphp/Slim](https://github.com/slimphp/Slim/tree/3.x/Slim/Http)
|
34
|
+
|
35
|
+
このように,同じインタフェースを実装する目的でも,2通りのやり方があります.慣れてくるとどっちを使ったほうがいいか何となくわかるようになります[要出典]
|
36
|
+
|
37
|
+
# TypeScriptの例
|
38
|
+
|
39
|
+
AngularJSのバージョン2.x系のソースが参考になると思います.
|
40
|
+
|
41
|
+
- [angular/modules/@angular/http/src at master · angular/angular](https://github.com/angular/angular/tree/master/modules/%40angular/http/src)
|
42
|
+
|
43
|
+
こちらはPHPの例で紹介したSlimのやり方と非常によく似ていますね.
|
44
|
+
|
45
|
+
|
46
|
+
|
2
補足
answer
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
- [co/ManualScheduler.php at master · mpyw/co](https://github.com/mpyw/co/blob/master/src/Internal/ManualScheduler.php) … 手動スケジューラ
|
15
15
|
- [co/Pool.php at master (L50-L52)· mpyw/co](https://github.com/mpyw/co/blob/master/src/Internal/Pool.php#L50-L52) … スケジューラのインスタンスを生成して利用するクラス
|
16
16
|
|
17
|
-
自動スケジューラでは`add()`されたリクエストを全部即座にlibcurlに丸投げしていますが,手動スケジューラでは「一定数だけlibcurlに投げて(`addImmediate()`),上限を超えたぶんはPHP側で保持しておく(`addReserved()`)」というように振り分けており,内部的な動作が微妙に違います.
|
17
|
+
自動スケジューラでは`add()`されたリクエストを全部即座にlibcurlに丸投げしていますが,手動スケジューラでは「一定数だけlibcurlに投げて(`addImmediate()`),上限を超えたぶんはPHP側で保持しておく(`addReserved()`)」というように振り分けており,さらに何かリクエストが1つ終わるたびに1個ずつPHPで保持しておいたもの取り出してlibcurlに投げる(`interruptConsume()`)ことをやっています.このように,内部的な動作が微妙に違います.
|
18
18
|
|
19
19
|
但しクラスが独自に持っているものはprivateに過ぎず,継承を抽象クラスから強制されたものはすべてprotectedかpublicになっており,それを**呼び出す側からはどちらも同じAbstractSchedulerとして扱える**点がミソです.Pool.phpでは3行だけでこの場合分けが済んでおり,中身がどちらになっているかを全く意識する必要がありません.
|
20
20
|
|
1
補足
answer
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
- [mpyw/co: Asynchronous cURL executor simply based on resource and Generator.](https://github.com/mpyw/co)
|
4
4
|
- [今cURLで並列処理を書くならジェネレータを使え! - Qiita](http://qiita.com/mpyw/items/44a001101914450257dc)
|
5
5
|
|
6
|
-
このライブラリは内部で有名なC言語製のlibcurlおよびそれのPHPバインディングを使っています.PHP7.0.7以降ではうまいことリクエストを集中させすぎないように抑制するオプションが設けられているのですが,7.0.6以前では存在していないため手動制御しています.双方に出来るだけラクに対応できるように,抽象クラスと継承を利用しています.
|
6
|
+
このライブラリは内部で有名なC言語製のlibcurlおよびそれのPHPバインディングを使っています.PHP7.0.7以降ではうまいことリクエストを集中させすぎないように抑制するオプションが設けられているのですが,7.0.6以前では存在していないため手動制御しています.双方に出来るだけラクに対応できるように,**抽象クラス**と継承を利用しています.
|
7
7
|
|
8
8
|
- [CURLOPT_MAXCONNECTS / CURLMOPT_MAXCONNECTS / CURLMOPT_MAX_TOTAL_CONNECTIONS の違い - Qiita](http://qiita.com/mpyw/items/f011e28638c43c974e7a)
|
9
9
|
|
@@ -16,4 +16,6 @@
|
|
16
16
|
|
17
17
|
自動スケジューラでは`add()`されたリクエストを全部即座にlibcurlに丸投げしていますが,手動スケジューラでは「一定数だけlibcurlに投げて(`addImmediate()`),上限を超えたぶんはPHP側で保持しておく(`addReserved()`)」というように振り分けており,内部的な動作が微妙に違います.
|
18
18
|
|
19
|
-
但しクラスが独自に持っているものはprivateに過ぎず,継承を抽象クラスから強制されたものはすべてprotectedかpublicになっており,それを呼び出す側からはどちらも同じAbstractSchedulerとして扱える点がミソです.Pool.phpでは3行だけでこの場合分けが済んでおり,中身がどちらになっているかを全く意識する必要がありません.
|
19
|
+
但しクラスが独自に持っているものはprivateに過ぎず,継承を抽象クラスから強制されたものはすべてprotectedかpublicになっており,それを**呼び出す側からはどちらも同じAbstractSchedulerとして扱える**点がミソです.Pool.phpでは3行だけでこの場合分けが済んでおり,中身がどちらになっているかを全く意識する必要がありません.
|
20
|
+
|
21
|
+
もし2つのクラスを両方とも一から作る場合,**同じようなメソッドをまるまるコピペする場所が生まれてしまって**,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりも**インタフェース**や**ミックスイン(トレイト)**といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.
|