Pythonã§ã¯ã©ã¹ãæžãå§ãããšãæåã«åºäŒã倧ããªå£ããã¯ã©ã¹å士ã®é¢ä¿ãã©ãèšèšãããããšããåé¡ã§ããå ±ééšåããããããšããããç¶æ¿ã§ã€ãªãã§ã¿ãããåŸãã仿§å€æŽãå ¥ã£ãç¬éã«ã³ãŒãå šäœã厩å£ããâŠâŠãããªèŠãçµéšããããŸãããïŒð±
ãããªæ©ã¿ã解決ããããŒã¯ãŒãããis-aïŒã€ãºã¢ïŒã®é¢ä¿ããšãhas-aïŒããºã¢ïŒã®é¢ä¿ãããã®2ã€ã®éããçè§£ããã°ãææ¥ããã®ã¯ã©ã¹èšèšã«ç¢ºããªçŸ éç€ãæã«å ¥ããå幎åŸã»1幎åŸã®èªåãå°ããªãã³ãŒããæžããããã«ãªããŸãâš
ããã°ã©ãã³ã°ã®åéã§äœ¿ããããã¯ã©ã¹å士ã®é¢ä¿ããšã¯ãè€æ°ã®ã¯ã©ã¹ãã©ãçµã³ã€ããŠãããã衚ãèãæ¹ã®ããšã§ãã代衚çãªãã®ã«ãis-aããšãhas-aãã®2çš®é¡ããããã©ã¡ãã䜿ããã§ã³ãŒãã®æ§é ãä¿å®æ§ã倧ããå€ãããŸãã
èšèã®èª¬æã ãã ãšåããã«ããã§ããããèãæ £ããªããšé£ãããã«æãããããããŸããããèãæ¹ã¯ãšã£ãŠãã·ã³ãã«ã§ãã
is-aïŒA is a BïŒã¯ããAã¯Bã§ãããAã¯Bã®äžçš®ã ããšããé¢ä¿ã衚ããŸããæ¥åžžã®äŸã§èãããšããããããã§ããã
ãã¢ã«ã³ãŒã«é£²æããšãã倧ããªã«ããŽãªã®äžã®äžã€ããã¯ã€ã³ãããšããã€ã¡ãŒãžã§ããããããPythonã§å®è£ ãããšãã«ã¯ãã¯ã©ã¹ã®ç¶æ¿ã䜿ããŸããåºåºã¯ã©ã¹ãBãæŽŸçã¯ã©ã¹ãAãšããé¢ä¿ã§ãã
ããšãã°ããŠãŒã¶ãŒã¯ã©ã¹ãšç®¡çè ãŠãŒã¶ãŒã¯ã©ã¹ããããšããŸãã
class User:
def __init__(self, user_id):
self.user_id = user_id
def login(self): ...
def logout(self): ...
def create_blog(self): ...
class AdminUser(User):
def remove_blog(self): ...
def remove_user(self): ... ã管çè
ãŠãŒã¶ãŒã¯ãŠãŒã¶ãŒã®äžçš®ããªã®ã§ãAdminUser 㯠User ãç¶æ¿ããŠã远å ã®æš©éïŒããã°åé€ã»ãŠãŒã¶ãŒåé€ïŒãæãããââãããã«æŽçãããis-aã®é¢ä¿ã§ããð
has-aïŒA has a BïŒã¯ããAã¯Bãæã£ãŠããŸãããšããé¢ä¿ã衚ããŸãããããäŸã§èŠããšã€ã¡ãŒãžããããã§ãã
ãããPythonã§å®è£ ãããšãã«ã¯ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ãšããŠå¥ã®ã¯ã©ã¹ã®ãªããžã§ã¯ããä¿æããæ¹æ³ã䜿ããŸããããã¯ãã³ã³ããžã·ã§ã³ããšãåŒã°ããèšèšææ³ã§ãã
ã·ã§ããã³ã°ã«ãŒããšååã®é¢ä¿ã§èããŠã¿ãŸãããã
class Item:
def __init__(self, item_id, item_name, item_price):
self.item_id = item_id
self.item_name = item_name
self.item_price = item_price
class ShoppingCart:
def __init__(self):
self.item_list = []
def add_item(self, item: Item):
self.item_list.append(item)
def remove_item(self, item: Item):
self.item_list.remove(item) ã·ã§ããã³ã°ã«ãŒãã¯ååããæã£ãŠãããââãŸãã«has-aã®é¢ä¿ãåãã³ãïŒitem: ItemïŒãä»ããŠãããšãåŒæ°ã«äœãæž¡ãã¹ãããäžç®ã§åãã£ãŠèªã¿ããããã¢ããããŸãð
ãããããæ¬èšäºã®æ žå¿ã§ããis-aã¯çŽæçã§çŸããèŠããŸãããå®ã¯ã倿Žã«åŒ±ãããšãã倧ããªæ¬ ç¹ãæ±ããŠããŸãã
å
ã»ã©ã® User â AdminUser ã®èšèšã«ãæ°ãããã¹ã¿ãããŠãŒã¶ãŒãã远å ããããªã£ããšããŸããã¹ã¿ãããŠãŒã¶ãŒã¯ããã°ã€ã³ã»ãã°ã¢ãŠãã¯ã§ããããã©ããã°äœæã¯ã§ãããé²èЧã ããã§ãããšããŸãã
ãã¹ã¿ãããŠãŒã¶ãŒã¯ãŠãŒã¶ãŒãã ãããçŽ çŽã« User ãç¶æ¿ããããªããŸããã§ãç¶æ¿ããç¬éãcreate_blog() ã¡ãœãããŸã§åŒãç¶ãã§ããŸãããããã°ãäœããªãã¯ãã®ã¹ã¿ãããäœããŠããŸãããšãããã°ãçãŸããŸãð±
ãããçŽãããšæããšãUserã¯ã©ã¹ããcreate_blog()ãåé€ããæ°ãã«ãäžè¬ãŠãŒã¶ãŒã¯ã©ã¹ããäœã£ãŠcreate_blog()ãç§»ããæ¢åã³ãŒãå
ã®Userãªããžã§ã¯ãããã¹ãŠäžè¬ãŠãŒã¶ãŒã¯ã©ã¹ã«æžãæãâŠâŠãšããå€§èŠæš¡ãªãã¡ã¯ã¿ãªã³ã°ãå¿
èŠã«ãªããŸãã
å°ããªã¯ã©ã¹ãªããŸã ãããå€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ãããããã®ã¯æ³åããã ãã§æ°ãé ããªããŸãããâŠâŠã
äžæ¹ãhas-aã®é¢ä¿ã¯ã¯ã©ã¹å士ã®ã€ãªããããããããã®ã§ãçæ¹ã®å€æŽãããçæ¹ã«æ³¢åãã«ãããšãã倧ããªã¡ãªããããããŸããã䟿å©ãããšããç¹ã§ã¯is-aã«æ¯ã¹ãŠå§åçã«åªäœãªãã§ãð
ãšã¯ãããis-aã䜿ã£ãŠã¯ãããªãããã§ã¯ãããŸãããã³ãŒãéãæžããããããªã¢ãŒãã£ãºã ïŒãªããžã§ã¯ãæåã®éèŠæŠå¿µïŒã䜿ããããšãã£ã倧ããªã¡ãªããããããŸãã
is-aã¯æèçã«æ³šæããªãã䜿ãå¿ èŠããããæ¬ ç¹ã¯ãããã®ã®ãã³ãŒãéãå°ãªããªã£ããããªã¢ãŒãã£ãºã ã䜿ãããªã©ã®å€§ããªã¡ãªããããããŸãã
䜿ãåãã®ç®å®ãšããŠã¯ã次ã®ããã«èãããšã¹ãããªããŸãã
è¿å¹Žã®ãœãããŠã§ã¢èšèšçéã§ã¯ãç¶æ¿ããã³ã³ããžã·ã§ã³ãåªå ããïŒFavor composition over inheritanceïŒããšããæ Œèšãåºãç¥ãããŠããŸããããŸãã«ãã®èãæ¹ã®æ ¹ã£ãã«ããã®ãis-a/has-aã®é¢ä¿æ§ãªãã§ãð
is-aãšhas-aã®æèŠãã€ããã ããæ¬¡ã¯äœç³»çã«ã¯ã©ã¹èšèšãšãªããžã§ã¯ãæåãåŠã³ãããšãããæžç±ã§éªšå€ªãªç¥èãå ¥ããããšã§ãçŸå Žã§ããã®èšèšã§ããã®ããªïŒããšè¿·ã£ããšãã®å€æè»žã確å®ã«èº«ã«ã€ããŸãð
Pythonã®ææ³ããã¯ã©ã¹ã»ç¶æ¿ã»ããªã¢ãŒãã£ãºã ãŸã§ã段éçã«åŠã¹ãå®çªå ¥éæžããã¯ã©ã¹ã£ãŠããããäœïŒããšããæ®µéã®äººã§ããå®å¿ããŠåå°ãåºããããŸãð±
SOLIDååããã¶ã€ã³ãã¿ãŒã³ããªãã¡ã¯ã¿ãªã³ã°ãªã©ãis-a/has-aã®èšèšå€æãæ¯ããçè«çããã¯ããŒã³ãç·åçã«åŠã¹ãäžåãããªãç¶æ¿ããã³ã³ããžã·ã§ã³ãæšå¥šãããã®ãããè ¹èœã¡ããŸãð§
ã¯ã©ã¹ã»ãããã³ã«ã»ããŒã¿ã¯ã©ã¹ã»æœè±¡åºåºã¯ã©ã¹ãšãã£ãçŸä»£Pythonã®ã¯ã©ã¹èšèšã«å¿ èŠãªèŠçŽ ããæ·±ãã»å®è·µçã«è§£èª¬ããåèãäžçŽããäžçŽãžã®æ©æž¡ãã«æé©ãªäžåã§ãð
åãã³ãã»æœè±¡ã¯ã©ã¹ã»ãããã³ã«ã»ãã¹ããªã©ãä¿å®æ§ã®é«ãPythonã³ãŒããæžãããã®å®è·µç¥ãåçž®ãããäžåãã倿Žã«åŒ±ãis-aããé²ãå ·äœçãªãã¯ããã¯ãåŠã¹ãŸãð¡ïž
ã³ã³ããžã·ã§ã³ã»ã¹ãã©ããžãŒã»ãã¡ã¯ããªãŒãªã©ãhas-aã®é¢ä¿ãå·§ã¿ã«æŽ»ãããèšèšãã¿ãŒã³ãäœç³»çã«ãŸãšãŸã£ãäžåããis-aã§è©°ãã ãšããããæžãæããã°ããã®ãïŒããšããçºèŠã®é£ç¶ã§ãð¡
åºæ¬çã«ã¯ãã®æ¹éã§å€§ããå€ããŸããããæããã«åãçš®é¡ã ããšç¢ºä¿¡ã§ããå Žåã ãis-aã䜿ãããã以å€ã¯has-aã§èšèšããŠãããšãåŸãã仿§å€æŽãå ¥ã£ãŠãæè»ã«å¯Ÿå¿ãããããªããŸãã
Pythonã¯å€éç¶æ¿ããµããŒãããŠããŸãããè€éããææ°é¢æ°çã«å¢ãäžã«ãã¡ãœãã解決é åºïŒMROïŒã§ãããããããªããŸããå€éç¶æ¿ããããMix-inããããã³ã«ãã³ã³ããžã·ã§ã³ãçµã¿åãããæ¹ããçµæçã«ã·ã³ãã«ã§ä¿å®ããããèšèšã«ãªããŸãã
ãæç¢ºã«å
±éã®ã€ã³ã¿ãŒãã§ãŒã¹ã匷å¶ããããå Žé¢ã§ã¯ABCãæå¹ã§ããabc.ABC ãç¶æ¿ã @abstractmethod ãä»ãããšããµãã¯ã©ã¹ã«ç¹å®ã®ã¡ãœããå®è£
ã匷å¶ã§ããŸããis-aãšhas-aã®äžéçãªãå¥çŽã«ããèšèšããå®çŸããããšãã«åœ¹ç«ã¡ãŸãã
å¿
é ã§ã¯ãããŸãããPythonã¯ããã¯ã¿ã€ãã³ã°ã®èšèªãªã®ã§ãåãã¡ãœããåããæã£ãŠããã°ç¶æ¿é¢ä¿ã«ãªããŠãããªã¢ãŒãã£ãã¯ã«æ±ããŸããtyping.Protocol ã䜿ãã°ãããåå®å
šã«ããã¯ã¿ã€ãã³ã°ãå®çŸã§ããŸãðŠ
ç¶æ¿ã§æžãããŠããã³ãŒããã³ã³ããžã·ã§ã³ã«æžãæããå Žåããã¹ããå å®ãããŠããå°ããã€é²ããã®ãéåã§ããäžæ°ã«æžãæããããšããã1ã¯ã©ã¹ãã€ã»1ã¡ãœãããã€ç§»è¡ããããšã§ããªã¹ã¯ãæå°åã§ããŸãð ïž
is-aãšhas-aââãã®2ã€ã®é¢ä¿æ§ãçè§£ããŠãããã©ããã§ãããªãã®ã¯ã©ã¹èšèšã¯åçã«å€ãããŸããããšããããç¶æ¿ããã忥ããããã®é¢ä¿ã¯is-aã§æ¬åœã«æãç«ã€ãïŒhas-aã§æžããæ¹ãæè»ãããªããïŒããšäžæ©ç«ã¡æ¢ãŸã£ãŠèããããããã«ãªãã°ãããªãã¯ããèšèšè ãšããŠäžæ®µäžã®ã¹ããŒãžã«ããŸãð
åç»ãèšäºã§åŸããšãã»ã³ã¹ããæžç±ã§äœç³»çã«æ·±ããã°ãããªãã®ãªããžã§ã¯ãæåèšèšåã¯äžçã¢ãã®è²¡ç£ã«ãªããŸãã仿¥ç޹ä»ãã5åããæ°ã«ãªãäžåãæã«åã£ãŠãã倿Žã«åŒ·ãã³ãŒããæžããéçºè ããžã®ç¬¬äžæ©ãèžã¿åºããŠã¿ãŠãã ããðð
â ïž Windowsã»ãã¥ãªã…
ð§ çªç¶ã®æçš¿ã«ãã¡ã³éšç¶ïŒã©…
ð§© ããºã«ãè§£ãå¿«æãã³ãŒãã§…
âš ããã°ã©ã ã®åäœã軜ããã…
ð ãµãŒããŒãµã€ãéçºã®äžçãž…
âš é¢åãªWebäœæ¥ãèªååã…