Skip to content

Commit

Permalink
[feat] Draft class inheritance warning
Browse files Browse the repository at this point in the history
  • Loading branch information
ftnext committed Mar 20, 2024
1 parent 11212a2 commit 021e6eb
Showing 1 changed file with 68 additions and 0 deletions.
68 changes: 68 additions & 0 deletions source/ooc/do-not-use-inheritance.rst.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
クラスの継承
======================================================================

*ここで野球をしてはいけません*

.. https://twitter.com/imasml_theater/status/1715897758924870031
『達人プログラマー』(第2版)より
--------------------------------------------------

第5章に「インヘリタンス(相続)税」

継承が答えになることは滅多にない (Kindle版 p.380)

(承前)継承の代わりに
--------------------------------------------------

* 型情報の共有には、インターフェース(やプロトコル)を
* 機能の共有には、mixin(やtrait)を

.. TODO 最近の自作OSSでのコード例を盛り込むか検討
わからん殺しされて言える「気軽に継承してはいけません」
------------------------------------------------------------

* 今となってはほしかったのはインターフェース
* 継承しか知らなかったのでゴリ押し:Template Methodパターンで穴埋め問題
* 穴埋め問題に落とし込めないケースが後から登場🤯

.. (Pythonではクラスの継承でインターフェースを表す部分の理解不足もあります)
機能の追加には、委譲を
------------------------------------------------------------

* 例:直近公開したOSS kurenai(紅)
* google-researchのrouge-scoreのラッパー
* デフォルトで日本語テキストからもROUGEという指標を算出したい

rouge-scoreとインターフェースを揃えつつ、日本語対応という機能追加
----------------------------------------------------------------------

.. code-block:: pycon
:emphasize-lines: 5-8
>>> from rouge_score.rouge_scorer import RougeScorer
>>> scorer = RougeScorer(["rouge1"])
>>> scorer.score('いぬ ねこ', 'いぬ ねこ')
{'rouge1': Score(precision=0.0, recall=0.0, fmeasure=0.0)}
>>> from kurenai.rouge_scorer import RougeScorer
>>> scorer = RougeScorer(["rouge1"])
>>> scorer.score('いぬ ねこ', 'いぬ ねこ')
{'rouge1': Score(precision=1.0, recall=1.0, fmeasure=1.0)}
rouge-score.RougeScorerの継承でなく、 **委譲** する
----------------------------------------------------------------------

.. code-block:: python
class RougeScorer(BaseScorer): # 本家RougeScorerと同じインターフェース(scoreメソッド持つ)
def __init__(self, rouge_types: list[str]) -> None:
self._scorer = OriginalRougeScorer(
rouge_types, tokenizer=AllCharacterSupportTokenizer()
)
def score(self, target, prediction): # 委譲による実装
return self._scorer.score(target, prediction)
https://github.com/ftnext/kurenai/blob/v0.0.1/src/kurenai/rouge_scorer.py#L9-L16

0 comments on commit 021e6eb

Please sign in to comment.