1. ð ã¯ããã«
ååã¯åœåèŠåïŒãã£ã¡ã«ã±ãŒã¹ã»ã¹ããŒã¯ã±ãŒã¹ã»è¯ãååã®æ¡ä»¶ïŒãåŠã³ãŸããã
ä»å㯠ã³ãŒãã®èšèšåå ã解説ããŸãïŒ
ãåãã³ãŒãããšãè¯ãã³ãŒããã¯å¥ç©ã§ãã
èšèšååãç¥ãããšã§ãããŒã ã§é·ã䜿ããã³ãŒããæžããããã«ãªããŸãã
ãã®èšäºãèªãã°ïŒ
- â DRYååïŒç¹°ãè¿ããé¿ããïŒãããã
- â KISSååïŒã·ã³ãã«ã«ä¿ã€ïŒãããã
- â åäžè²¬ä»»ã®ååãããã
- â 颿°ã®é·ãã»åŒæ°ã®æ°ã®ç®å®ãããã
2. ðºïž èšèšååã®å šäœå
3. ð DRYååïŒDon't Repeat YourselfïŒ
äžèšã§èšããš
ãåãã³ãŒããç¹°ãè¿ããŠæžããªãããšããååã§ãã
DRY ïŒ Don't Repeat YourselfïŒèªåèªèº«ãç¹°ãè¿ããªïŒ
ãªãç¹°ãè¿ããåé¡ãªã®ã
# Python
# â DRYååéåïŒåãèšç®ã3ãæã«æžãããŠãã
def print_order_summary_a(price: int, quantity: int) -> None:
"""泚æAã®ãµããªãŒã衚瀺ããã"""
tax = price * quantity * 0.10 # æ¶è²»çšèšç®
total = price * quantity + tax
print(f"åèšïŒ{total}å")
def print_order_summary_b(price: int, quantity: int) -> None:
"""泚æBã®ãµããªãŒã衚瀺ããã"""
tax = price * quantity * 0.10 # åãæ¶è²»çšèšç®ããŸãããïŒ
total = price * quantity + tax
print(f"åèšïŒ{total}å")
def print_order_summary_c(price: int, quantity: int) -> None:
"""泚æCã®ãµããªãŒã衚瀺ããã"""
tax = price * quantity * 0.10 # ãŸããŸãåãèšç®ïŒ
total = price * quantity + tax
print(f"åèšïŒ{total}å")
# æ¶è²»çšçã10%â15%ã«å€ãã£ãã3ãæå
šéšçŽãå¿
èŠããã ð±
# Python
# â
DRYååãå®ãïŒå
±éåŠçã1ãæã«ãŸãšãã
TAX_RATE = 0.10 # 宿°åããŠãã
def calculate_total(price: int, quantity: int) -> int:
"""çšèŸŒåèšéé¡ãèšç®ããã
Args:
price: å䟡
quantity: æ°é
Returns:
çšèŸŒåèšéé¡
"""
subtotal = price * quantity
tax = subtotal * TAX_RATE
return subtotal + tax
def print_order_summary_a(price: int, quantity: int) -> None:
"""泚æAã®ãµããªãŒã衚瀺ããã"""
print(f"åèšïŒ{calculate_total(price, quantity)}å")
def print_order_summary_b(price: int, quantity: int) -> None:
"""泚æBã®ãµããªãŒã衚瀺ããã"""
print(f"åèšïŒ{calculate_total(price, quantity)}å")
# çšçãå€ãã£ãŠã TAX_RATE ã®1ãæã ãçŽãã°OKïŒ ð¯
DRYååã®3ã€ã®ã¡ãªãã
| ã¡ãªãã | 説æ |
|---|---|
| ð§ ä¿®æ£ã1ãæã§æžã | 仿§å€æŽã®ãšãæŒããªã察å¿ã§ãã |
| ð ãã°ãæžã | ã³ãããããã³ã«ãã°ãäžç·ã«ã³ããŒããŠããŸããªã¹ã¯ããªããªã |
| ð èªã¿ããããªã | åãããžãã¯ã«ååãã€ããŠæå³ãæç¢ºã«ãªã |
DRYååã®æ³šæç¹
â ïž ã䌌ãŠããã³ãŒããããã¹ãŠå ±éåããã°ããããã§ã¯ãããŸããïŒ
ãä»ã¯äŒŒãŠãããå°æ¥å€ããããããªã³ãŒããç¡çã«å ±éåãããšã
倿Žãããã³ã«è€éãªæ¡ä»¶åå²ãå¢ããŠããã£ãŠèªã¿ã«ãããªããŸããããã ãééã£ãæœè±¡åïŒWrong AbstractionïŒã ãšåŒã³ãŸãã
ãæ¬è³ªçã«åãããžãã¯ãã ããå ±éåããã®ãDRYã®æ£ããäœ¿ãæ¹ã§ãã
ãã³ããã®éè€ãããããééã£ãå ±éåãã®æ¹ããåŸããä¿®æ£ããã®ãé£ãããªãã
ããªããšãªã䌌ãŠããããå ±éåãããããšãã倿ã¯èŠæ³šæã§ãã
éè€ãæ°ã«ãªã£ãŠãããŸãå°ãæ§åãèŠãŠæ¬åœã«åãããžãã¯ã確èªããŠããå ±éåããŸãããã
4. ð KISSååïŒKeep It Simple, StupidïŒ
äžèšã§èšããš
ãã·ã³ãã«ã«ä¿ãŠããšããååã§ãã
KISS ïŒ Keep It Simple, StupidïŒã·ã³ãã«ã«ããããã®ãã«ïŒïŒ
â» Stupid ã¯ãã·ã³ãã«ã«ããªãããšãã«åããããèšèã§ã
è€éã«ããããæªãäŸ
# Python
# â è€éãããïŒ1è¡ã§æžãããšããããŠãã
def get_active_adult_user_names(users: list) -> list:
"""ã¢ã¯ãã£ããªæäººãŠãŒã¶ãŒã®ååäžèЧãè¿ãã"""
return [u.name for u in users if u.is_active and u.age >= 18 and not u.is_deleted and u.email_verified]
â» 1è¡ã§ã¹ããŒãã«æžããŠããããã«èŠããŸããã
ã18æ³ä»¥äžã»åé€ãããŠããªãã»ã¡ãŒã«èªèšŒæžã¿ã»ã¢ã¯ãã£ãããšãã
è€æ°ã®æ¡ä»¶ã1ç®æã«åçž®ãããŠããããã
ãããšèŠãŠäœãããŠãããçè§£ãã¥ãããªã£ãŠããŸãã
ãçãæžãããšïŒã·ã³ãã«ãã§ã¯ãããŸããã
èªã人ã«ãšã£ãŠãããããããã©ããããã·ã³ãã«ãã®æ¬è³ªã§ãã
# Python
# â
ã·ã³ãã«ã§èªã¿ãããïŒæ¡ä»¶ãåããŠæå³ãæç¢ºã«ãã
def get_active_adult_user_names(users: list) -> list:
"""ã¢ã¯ãã£ããªæäººãŠãŒã¶ãŒã®ååäžèЧãè¿ãã
Args:
users: ãŠãŒã¶ãŒã®ãªã¹ã
Returns:
æ¡ä»¶ãæºãããŠãŒã¶ãŒã®ååãªã¹ã
"""
result = []
for user in users:
is_adult = user.age >= 18
is_available = user.is_active and not user.is_deleted
is_verified = user.email_verified
if is_adult and is_available and is_verified:
result.append(user.name)
return result
ãè³¢ãæžãããããèªã¿ãããæžãããåªå ããŸãããã
1幎åŸã®èªåãæ°ããããŒã ã¡ã³ããŒãèªãã§ã
5ç§ã§çè§£ã§ããã³ãŒããè¯ãã³ãŒãã§ãã
KISSååã®ãã§ãã¯ãªã¹ã
| ãã§ãã¯é ç® | å€æåºæº |
|---|---|
| ð ã³ãŒããèªãã§3ç§ã§çè§£ã§ããã | ã§ããªããã°ã·ã³ãã«ã«ããäœå°ãã |
| ð æ¡ä»¶åŒãè€éãããªãã | 3ã€ä»¥äžã®æ¡ä»¶ãéãªã£ãŠãããåå²ãæ€èš |
| ð§© 1ã€ã®åŠçãå€ãã®ããšãããŠããªãã | ããããŠããããŠããããããªãåå² |
| ð æè¡çã«é¢çœããèªã¿ã«ãããªãã | ãè³¢ãã³ãŒããã¯ä¿å®ã®æµ |
5. ð¯ åäžè²¬ä»»ã®ååïŒSingle Responsibility PrincipleïŒ
äžèšã§èšããš
ã1ã€ã®é¢æ°ã»ã¯ã©ã¹ã¯1ã€ã®ããšã ããæ åœããããšããååã§ãã
è±èªã§ã¯ SRPïŒSingle Responsibility PrincipleïŒãšåŒã°ãã
åŸè¿°ããSOLIDååã®ãSãã«ããããŸãã
è²¬ä»»ãæ··åšããæªãäŸ
# Python
# â 1ã€ã®é¢æ°ãè€æ°ã®ããšãããŠãã
def process_user(user_id: int) -> None:
"""ãŠãŒã¶ãŒãåŠçããã"""
# â DBãããŠãŒã¶ãŒååŸ
user = db.query(f"SELECT * FROM users WHERE id = {user_id}")
# â¡ ããªããŒã·ã§ã³
if not user.email:
raise ValueError("ã¡ãŒã«ã¢ãã¬ã¹ããããŸãã")
# ⢠ååããã©ãŒããã
formatted_name = user.name.upper()
# ⣠ã¡ãŒã«éä¿¡
send_email(user.email, f"ããã«ã¡ã¯ {formatted_name} ãã")
# †ãã°èšé²
print(f"[LOG] ãŠãŒã¶ãŒ {user_id} ã«éä¿¡å®äº")
# ãã®é¢æ°ã¯ãååŸã»æ€èšŒã»å å·¥ã»éä¿¡ã»ãã°ãã®5ã€ã®è²¬ä»»ãæã£ãŠãã ð±
#Python
# â
責任ãåé¢ããè¯ãäŸ
def get_user(user_id: int) -> User:
"""DBãããŠãŒã¶ãŒãååŸããã
Args:
user_id: ãŠãŒã¶ãŒID
Returns:
ãŠãŒã¶ãŒãªããžã§ã¯ã
"""
return db.query(f"SELECT * FROM users WHERE id = {user_id}")
def validate_user(user: User) -> None:
"""ãŠãŒã¶ãŒã®ããªããŒã·ã§ã³ãè¡ãã
Args:
user: æ€èšŒãããŠãŒã¶ãŒ
Raises:
ValueError: ã¡ãŒã«ã¢ãã¬ã¹ãæªèšå®ã®å Žå
"""
if not user.email:
raise ValueError("ã¡ãŒã«ã¢ãã¬ã¹ããããŸãã")
def format_user_name(name: str) -> str:
"""ãŠãŒã¶ãŒåã倧æåã«ãã©ãŒãããããã
Args:
name: ãã©ãŒããããããŠãŒã¶ãŒå
Returns:
倧æåã«ãã©ãŒããããããåå
"""
return name.upper()
def send_welcome_email(user: User, formatted_name: str) -> None:
"""ãŠã§ã«ã«ã ã¡ãŒã«ãéä¿¡ããã
Args:
user: éä¿¡å
ã®ãŠãŒã¶ãŒ
formatted_name: ãã©ãŒãããæžã¿ã®åå
"""
send_email(user.email, f"ããã«ã¡ã¯ {formatted_name} ãã")
def log_email_sent(user_id: int) -> None:
"""ã¡ãŒã«éä¿¡ã®ãã°ãèšé²ããã
Args:
user_id: ãã°ã«èšé²ãããŠãŒã¶ãŒID
"""
print(f"[LOG] ãŠãŒã¶ãŒ {user_id} ã«éä¿¡å®äº")
# çµã¿åãããŠäœ¿ãïŒå颿°ã1ã€ã®ããšã ããæ
åœïŒ
def process_user(user_id: int) -> None:
"""ãŠãŒã¶ãŒãžã®ãŠã§ã«ã«ã ã¡ãŒã«éä¿¡ãè¡ãã"""
user = get_user(user_id)
validate_user(user)
formatted_name = format_user_name(user.name)
send_welcome_email(user, formatted_name)
log_email_sent(user_id)
ð¡ åœåèŠåãšã®é£åæ§ã«æ³šç®ïŒ
è²¬ä»»ãæ··åšããŠããprocess_userïŒãåŠçããããšããææ§ãªåè©ïŒãã
åå²åŸã¯get_userã»validate_userã»send_welcome_emailã®ããã«
第äºåã§åŠãã ãåè©ïŒåè©ãã®å ·äœçãªååãèªç¶ãšã€ããããŠããŸããã颿°ã«è¯ãååãã€ããããªãããšæãããšãã¯ã
ãã®é¢æ°ãè€æ°ã®è²¬ä»»ãæã£ãŠãããµã€ã³ãããããŸããã
åäžè²¬ä»»ãæèãããšãèªç¶ãšè¯ãåœåãã§ããããã«ãªããŸãð¯
åäžè²¬ä»»ã®ã¡ãªãã
| ã¡ãªãã | 説æ |
|---|---|
| 𧪠ãã¹ããããã | å°ããªé¢æ°ã¯åäœãã¹ããæžãããã |
| ð§ ä¿®æ£ãããã | 倿Žã®åœ±é¿ç¯å²ãå°ãããªã |
| â»ïž åå©çšãããã | 1ã€ã®ããšããã颿°ã¯å¥ã®å Žæã§ã䜿ãããã |
| ð èªã¿ããã | 颿°åãèŠãã ãã§äœããããããã |
6. ð 颿°ã®èšèšïŒé·ãã»åŒæ°ã®æ°ã®ç®å®
颿°ã®é·ã
| ç®å® | å€æåºæº |
|---|---|
| â 20è¡ä»¥å | 1ç»é¢ã§å šäœãèŠããã»çæ³ç |
| â ïž 20ã50è¡ | é·ãããŸã 蚱容ç¯å²ã»åå²ãæ€èš |
| â 50è¡ä»¥äž | ã»ãŒç¢ºå®ã«è€æ°ã®è²¬ä»»ãæã£ãŠããã»åå²ãã¹ã |
ð¡ ãã¹ã¯ããŒã«ããªããšå šäœãèŠããªã颿°ã¯å±éºãµã€ã³ã
1ç»é¢ã«åãŸãé·ããæèããŸãããã
åŒæ°ã®æ°
| åŒæ°ã®æ° | è©äŸ¡ | å¯ŸåŠæ³ |
|---|---|---|
| 0ã2å | â çæ³ç | ãã®ãŸãŸ |
| 3å | â ïž èŠæ³šæ | åé¡ã¯ãªããèšèšãèŠçŽãäœå°ãã |
| 4åä»¥äž | â å€ãã | ãªããžã§ã¯ãã»èŸæžã«ãŸãšããããšãæ€èš |
# Python
# â åŒæ°ãå€ããã
def create_user(
name: str,
email: str,
age: int,
address: str,
phone: str,
role: str
) -> User: ...
# â
ãªããžã§ã¯ãã«ãŸãšããïŒPythonïŒ
from dataclasses import dataclass
@dataclass
class CreateUserInput:
"""ãŠãŒã¶ãŒäœæã«å¿
èŠãªå
¥åããŒã¿ã"""
name: str
email: str
age: int
address: str
phone: str
role: str
def create_user(input: CreateUserInput) -> User:
"""ãŠãŒã¶ãŒãäœæããã
Args:
input: ãŠãŒã¶ãŒäœæã«å¿
èŠãªå
¥åããŒã¿
Returns:
äœæããããŠãŒã¶ãŒ
"""
...
// â
ãªããžã§ã¯ãã«ãŸãšããïŒTypeScriptïŒ
interface CreateUserInput {
name: string;
email: string;
age: number;
address: string;
phone: string;
role: string;
}
function createUser(input: CreateUserInput): User {
// input.nameã»input.email⊠ãšäœ¿ãã
...
}
// åŒã³åºãåŽãèªã¿ãããïŒ
createUser({
name: "Alice",
email: "alice@example.com",
age: 25,
address: "æ±äº¬éœæžè°·åº",
phone: "090-1234-5678",
role: "admin",
});
ð¡ åŒæ°ããªããžã§ã¯ãã«ãŸãšããã¡ãªããïŒ
- åŒã³åºãåŽã§ãäœã®å€ãããããŒåã§ããã
- åŒæ°ã®é çªãééãããã°ããªããªã
- åŸããæ°ããããããã£ã远å ãããã
7. ð ã³ã©ã ïŒSOLIDååãšã¯ïŒ
SOLIDåå ãšã¯ããªããžã§ã¯ãæåèšèšã«ããã5ã€ã®éèŠãªæéããŸãšãããã®ã§ãã
ä»ååŠãã å 容ã¯ããã®å ¥ãå£ã«ãªã£ãŠããŸãã
| é æå | ååå | äžèšã§èšããš |
|---|---|---|
| S | åäžè²¬ä»»ã®ååïŒSRPïŒ | 1ã€ã®ã¯ã©ã¹ã»é¢æ°ã¯1ã€ã®ããšã ãæ åœãã |
| O | ãªãŒãã³ã¯ããŒãºãã®ååïŒOCPïŒ | æ¡åŒµã«ã¯éããŠã»ä¿®æ£ã«ã¯éããŠããèšèšã«ãã |
| L | ãªã¹ã³ã眮æååïŒLSPïŒ | 掟çã¯ã©ã¹ã¯åºåºã¯ã©ã¹ãšçœ®ãæããŠãåãããã«ãã |
| I | ã€ã³ã¿ãŒãã§ãŒã¹åé¢ã®ååïŒISPïŒ | 䜿ããªãã¡ãœãããžã®äŸåã匷å¶ããªã |
| D | äŸåé¢ä¿é転ã®ååïŒDIPïŒ | å ·äœçãªå®è£ ã§ã¯ãªãæœè±¡ã«äŸåãã |
ð SOLIDååãããã«æ·±ãåŠã³ããæ¹ãžïŒ
ãã®ã·ãªãŒãºã®ãAIãæžããã³ãŒããã¬ãã¥ãŒããã¹ãã«ãèãããã第äžåãèšèšã»ã¢ãŒããã¯ãã£ã®èŠç¹ãã§ã
SRPïŒåäžè²¬ä»»ïŒãšOCPïŒãªãŒãã³ã¯ããŒãºãïŒãå®éã®ã³ãŒãäŸãšãšãã«è§£èª¬ããŠããŸããð [AIã³ãŒãã¬ãã¥ãŒã·ãªãŒãºç¬¬äžå]
8. ð¯ ãŸãšã
| åå | äžèšã§èšããš | å®ããšã©ããªã |
|---|---|---|
| ð DRY | åãã³ãŒããç¹°ãè¿ããªã | ä¿®æ£ã1ãæã§æžãã»ãã°ãæžã |
| ð KISS | ã·ã³ãã«ã«ä¿ã€ | èªã¿ãããã»ä¿å®ãããã |
| ð¯ åäžè²¬ä»» | 1ã€ã®ããšã ããæ åœãã | ãã¹ãããããã»åå©çšãããã |
| ð 颿°ã®é·ã | 20è¡ä»¥å ãç®å®ã« | 1ç»é¢ã§å šäœãææ¡ã§ãã |
| ð åŒæ°ã®æ° | 3å以å ãç®å®ã« | åŒã³åºããããã»ãã¹ããããã |
ãè¯ãã³ãŒããšã¯ãæªæ¥ã®èªåã仲éã«ãšã£ãŠèªã¿ãããã³ãŒãã§ããã
DRYã»KISSã»åäžè²¬ä»»ã®3ã€ãæèããã ãã§ã
ã³ãŒãã®å質ã¯å€§ããå€ãããŸãðª
次å㯠ã³ã¡ã³ãã»ããã¥ã¡ã³ã ã解説ããŸãïŒ
è¯ãã³ã¡ã³ãã»æªãã³ã¡ã³ãã®éãã»ããžãã¯ãã³ããŒã®æé€ã»
ããªããæžãããšããããã®ã³ã¡ã³ãè¡ãåŠã³ãŸãð
ð¬ 質åãææ³ãããã°ãã³ã¡ã³ãæ¬ã§ãæ°è»œã«ã©ãã!
ð 圹ã«ç«ã£ãããããã&ã¹ããã¯ããé¡ãããŸã!
ð ãããŸã§èªãã§ãã ãã£ãŠãæ¬åœã«ããããšãããããŸãã!
ð ã·ãªãŒãºèšäº
- ã第äžåãã³ãŒãã®åºæ¬æ§é
- ã第äºåãåœåèŠå
- ã第äžåãã³ãŒãã®èšèšååïŒãã®èšäºïŒ
- ã第ååãã³ã¡ã³ãã»ããã¥ã¡ã³ãïŒè¿æ¥å ¬éïŒ
- ã第äºåããšã©ãŒãã³ããªã³ã°ïŒè¿æ¥å ¬éïŒ
- ã第å åããã¹ãã»ãã¡ã€ã«æ§é ã»ããŒãžã§ã³ç®¡çïŒè¿æ¥å ¬éïŒ