-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[feat] Draft class inheritance warning
- Loading branch information
Showing
1 changed file
with
68 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |