@sylix/coworker 2.0.11 → 2.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/slash/config.d.ts.map +1 -1
- package/dist/commands/slash/config.js +22 -4
- package/dist/commands/slash/config.js.map +1 -1
- package/dist/core/CoWorkerAgent.d.ts.map +1 -1
- package/dist/core/CoWorkerAgent.js +6 -3
- package/dist/core/CoWorkerAgent.js.map +1 -1
- package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
- package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
- package/dist/skills/defaults/ai-ml/rag.md +276 -0
- package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
- package/dist/skills/defaults/backend-development/api-design.md +285 -0
- package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
- package/dist/skills/defaults/backend-development/async-python.md +237 -0
- package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
- package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
- package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
- package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
- package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
- package/dist/skills/defaults/backend-development/database-design.md +305 -0
- package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
- package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
- package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
- package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
- package/dist/skills/defaults/backend-development/fastapi.md +309 -0
- package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
- package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
- package/dist/skills/defaults/backend-development/microservices.md +284 -0
- package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
- package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
- package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
- package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
- package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
- package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
- package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
- package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
- package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
- package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
- package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
- package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
- package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
- package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
- package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
- package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
- package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
- package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
- package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
- package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
- package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
- package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
- package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
- package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
- package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
- package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
- package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
- package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
- package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
- package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
- package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
- package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
- package/dist/skills/defaults/data-engineering/airflow.md +519 -0
- package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
- package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
- package/dist/skills/defaults/data-engineering/dbt.md +556 -0
- package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
- package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
- package/dist/skills/defaults/data-engineering/spark.md +411 -0
- package/dist/skills/defaults/database/postgresql.md +202 -0
- package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
- package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
- package/dist/skills/defaults/devops/changelog-automation.md +580 -0
- package/dist/skills/defaults/devops/cicd.md +314 -0
- package/dist/skills/defaults/devops/cloud.md +263 -0
- package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
- package/dist/skills/defaults/devops/cost-optimization.md +295 -0
- package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
- package/dist/skills/defaults/devops/docker.md +281 -0
- package/dist/skills/defaults/devops/git-workflows.md +205 -0
- package/dist/skills/defaults/devops/github-actions.md +311 -0
- package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
- package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
- package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
- package/dist/skills/defaults/devops/kubernetes.md +339 -0
- package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
- package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
- package/dist/skills/defaults/devops/observability.md +243 -0
- package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
- package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
- package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
- package/dist/skills/defaults/devops/secrets-management.md +341 -0
- package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
- package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
- package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
- package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
- package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
- package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
- package/dist/skills/defaults/frontend/interaction-design.md +327 -0
- package/dist/skills/defaults/frontend/javascript.md +311 -0
- package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
- package/dist/skills/defaults/frontend/react-native-design.md +440 -0
- package/dist/skills/defaults/frontend/react.md +345 -0
- package/dist/skills/defaults/frontend/responsive-design.md +472 -0
- package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
- package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
- package/dist/skills/defaults/frontend/typescript.md +334 -0
- package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
- package/dist/skills/defaults/frontend/web-component-design.md +279 -0
- package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
- package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
- package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
- package/dist/skills/defaults/kubernetes/gitops.md +280 -0
- package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
- package/dist/skills/defaults/kubernetes/helm.md +343 -0
- package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
- package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
- package/dist/skills/defaults/kubernetes/manifests.md +330 -0
- package/dist/skills/defaults/kubernetes/security.md +337 -0
- package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
- package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
- package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
- package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
- package/dist/skills/defaults/llm-application/langchain.md +259 -0
- package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
- package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
- package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
- package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
- package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
- package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
- package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
- package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
- package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
- package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
- package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
- package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
- package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
- package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
- package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
- package/dist/skills/defaults/security/auditor.md +168 -0
- package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
- package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
- package/dist/skills/defaults/security/mtls-configuration.md +349 -0
- package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
- package/dist/skills/defaults/security/sast-configuration.md +182 -0
- package/dist/skills/defaults/security/security.md +313 -0
- package/dist/skills/defaults/security/stride-analysis.md +273 -0
- package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
- package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
- package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
- package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
- package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
- package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
- package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
- package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
- package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
- package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
- package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
- package/dist/skills/defaults/testing/testing.md +332 -0
- package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
- package/dist/skills/defaults/workflows/track-management.md +592 -0
- package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +129 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/utils/character.js +4 -4
- package/dist/utils/character.js.map +1 -1
- package/dist/utils/inputbar.d.ts.map +1 -1
- package/dist/utils/inputbar.js +7 -0
- package/dist/utils/inputbar.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-refactoring-patterns
|
|
3
|
+
description: Master code refactoring techniques to improve code quality, reduce complexity, and apply SOLID principles. Use when improving existing code, reducing technical debt, or applying design patterns.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code Refactoring Patterns
|
|
7
|
+
|
|
8
|
+
Master code refactoring techniques to improve code quality, reduce complexity, and apply SOLID principles.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
- Improving existing codebases
|
|
13
|
+
- Reducing technical debt
|
|
14
|
+
- Applying SOLID principles
|
|
15
|
+
- Extracting complex logic into smaller functions
|
|
16
|
+
- Converting procedural code to object-oriented
|
|
17
|
+
- Improving testability
|
|
18
|
+
|
|
19
|
+
## Core Refactoring Techniques
|
|
20
|
+
|
|
21
|
+
### 1. Extract Method
|
|
22
|
+
|
|
23
|
+
**Before:**
|
|
24
|
+
```python
|
|
25
|
+
def process_order(order):
|
|
26
|
+
# Validate order
|
|
27
|
+
if order.customer_id is None:
|
|
28
|
+
return False
|
|
29
|
+
if not order.items:
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
# Calculate total
|
|
33
|
+
total = 0
|
|
34
|
+
for item in order.items:
|
|
35
|
+
total += item.price * item.quantity
|
|
36
|
+
|
|
37
|
+
# Apply discount
|
|
38
|
+
if total > 100:
|
|
39
|
+
total *= 0.9
|
|
40
|
+
|
|
41
|
+
# Save order
|
|
42
|
+
order.total = total
|
|
43
|
+
db.save(order)
|
|
44
|
+
|
|
45
|
+
return True
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**After:**
|
|
49
|
+
```python
|
|
50
|
+
def process_order(order):
|
|
51
|
+
if not validate_order(order):
|
|
52
|
+
return False
|
|
53
|
+
|
|
54
|
+
total = calculate_total(order)
|
|
55
|
+
total = apply_discount(total)
|
|
56
|
+
|
|
57
|
+
order.total = total
|
|
58
|
+
db.save(order)
|
|
59
|
+
|
|
60
|
+
return True
|
|
61
|
+
|
|
62
|
+
def validate_order(order):
|
|
63
|
+
return order.customer_id is not None and bool(order.items)
|
|
64
|
+
|
|
65
|
+
def calculate_total(order):
|
|
66
|
+
return sum(item.price * item.quantity for item in order.items)
|
|
67
|
+
|
|
68
|
+
def apply_discount(total):
|
|
69
|
+
return total * 0.9 if total > 100 else total
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 2. Replace Conditional with Polymorphism
|
|
73
|
+
|
|
74
|
+
**Before:**
|
|
75
|
+
```python
|
|
76
|
+
class Employee:
|
|
77
|
+
def calculate_pay(self):
|
|
78
|
+
if self.type == "hourly":
|
|
79
|
+
return self.hours * self.rate
|
|
80
|
+
elif self.type == "salary":
|
|
81
|
+
return self.salary / 12
|
|
82
|
+
elif self.type == "commission":
|
|
83
|
+
return self.salary + self.commission
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**After:**
|
|
87
|
+
```python
|
|
88
|
+
from abc import ABC, abstractmethod
|
|
89
|
+
|
|
90
|
+
class Employee(ABC):
|
|
91
|
+
@abstractmethod
|
|
92
|
+
def calculate_pay(self):
|
|
93
|
+
pass
|
|
94
|
+
|
|
95
|
+
class HourlyEmployee(Employee):
|
|
96
|
+
def calculate_pay(self):
|
|
97
|
+
return self.hours * self.rate
|
|
98
|
+
|
|
99
|
+
class SalariedEmployee(Employee):
|
|
100
|
+
def calculate_pay(self):
|
|
101
|
+
return self.salary / 12
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 3. Introduce Parameter Object
|
|
105
|
+
|
|
106
|
+
**Before:**
|
|
107
|
+
```python
|
|
108
|
+
def create_report(start_date, end_date, include_charts, include_summary,
|
|
109
|
+
include_details, department, region):
|
|
110
|
+
# Report creation logic
|
|
111
|
+
pass
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**After:**
|
|
115
|
+
```python
|
|
116
|
+
from dataclasses import dataclass
|
|
117
|
+
|
|
118
|
+
@dataclass
|
|
119
|
+
class ReportParams:
|
|
120
|
+
start_date: date
|
|
121
|
+
end_date: date
|
|
122
|
+
include_charts: bool = False
|
|
123
|
+
include_summary: bool = True
|
|
124
|
+
include_details: bool = False
|
|
125
|
+
department: str = None
|
|
126
|
+
region: str = None
|
|
127
|
+
|
|
128
|
+
def create_report(params: ReportParams):
|
|
129
|
+
# Report creation logic
|
|
130
|
+
pass
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 4. Replace Magic Numbers with Constants
|
|
134
|
+
|
|
135
|
+
**Before:**
|
|
136
|
+
```python
|
|
137
|
+
def calculate_tax(amount):
|
|
138
|
+
return amount * 1.2
|
|
139
|
+
|
|
140
|
+
if status == 1: # What is 1?
|
|
141
|
+
pass
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**After:**
|
|
145
|
+
```python
|
|
146
|
+
TAX_RATE = Decimal('1.20')
|
|
147
|
+
class Status:
|
|
148
|
+
ACTIVE = 1
|
|
149
|
+
INACTIVE = 2
|
|
150
|
+
PENDING = 3
|
|
151
|
+
|
|
152
|
+
def calculate_tax(amount):
|
|
153
|
+
return amount * TAX_RATE
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 5. Extract Interface
|
|
157
|
+
|
|
158
|
+
**Before:**
|
|
159
|
+
```python
|
|
160
|
+
class OrderService:
|
|
161
|
+
def create_order(self, data):
|
|
162
|
+
# validation + creation logic
|
|
163
|
+
|
|
164
|
+
def cancel_order(self, order_id):
|
|
165
|
+
# cancellation logic
|
|
166
|
+
|
|
167
|
+
class CustomerService:
|
|
168
|
+
def create_customer(self, data):
|
|
169
|
+
# validation + creation logic
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**After:**
|
|
173
|
+
```python
|
|
174
|
+
from abc import ABC, abstractmethod
|
|
175
|
+
|
|
176
|
+
class Creatable(ABC):
|
|
177
|
+
@abstractmethod
|
|
178
|
+
def create(self, data):
|
|
179
|
+
pass
|
|
180
|
+
|
|
181
|
+
class OrderService(Creatable):
|
|
182
|
+
def create(self, data):
|
|
183
|
+
# creation logic
|
|
184
|
+
|
|
185
|
+
class CustomerService(Creatable):
|
|
186
|
+
def create(self, data):
|
|
187
|
+
# creation logic
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## SOLID Principles
|
|
191
|
+
|
|
192
|
+
### Single Responsibility Principle (SRP)
|
|
193
|
+
|
|
194
|
+
Each class should have only one reason to change:
|
|
195
|
+
|
|
196
|
+
```python
|
|
197
|
+
# BAD: Multiple responsibilities
|
|
198
|
+
class User:
|
|
199
|
+
def authenticate(self, password):
|
|
200
|
+
pass
|
|
201
|
+
|
|
202
|
+
def save_to_database(self):
|
|
203
|
+
pass
|
|
204
|
+
|
|
205
|
+
def send_email(self):
|
|
206
|
+
pass
|
|
207
|
+
|
|
208
|
+
# GOOD: Separate responsibilities
|
|
209
|
+
class User:
|
|
210
|
+
pass
|
|
211
|
+
|
|
212
|
+
class Authenticator:
|
|
213
|
+
def authenticate(self, user, password):
|
|
214
|
+
pass
|
|
215
|
+
|
|
216
|
+
class UserRepository:
|
|
217
|
+
def save(self, user):
|
|
218
|
+
pass
|
|
219
|
+
|
|
220
|
+
class EmailService:
|
|
221
|
+
def send(self, user, message):
|
|
222
|
+
pass
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Open/Closed Principle (OCP)
|
|
226
|
+
|
|
227
|
+
Open for extension, closed for modification:
|
|
228
|
+
|
|
229
|
+
```python
|
|
230
|
+
# BAD: Need to modify to add new types
|
|
231
|
+
class AreaCalculator:
|
|
232
|
+
def calculate(self, shape):
|
|
233
|
+
if isinstance(shape, Circle):
|
|
234
|
+
return math.pi * shape.radius ** 2
|
|
235
|
+
elif isinstance(shape, Rectangle):
|
|
236
|
+
return shape.width * shape.height
|
|
237
|
+
# Need to modify for new shapes
|
|
238
|
+
|
|
239
|
+
# GOOD: Add new shapes without modification
|
|
240
|
+
from abc import ABC, abstractmethod
|
|
241
|
+
|
|
242
|
+
class Shape(ABC):
|
|
243
|
+
@abstractmethod
|
|
244
|
+
def area(self):
|
|
245
|
+
pass
|
|
246
|
+
|
|
247
|
+
class Circle(Shape):
|
|
248
|
+
def area(self):
|
|
249
|
+
return math.pi * self.radius ** 2
|
|
250
|
+
|
|
251
|
+
class Rectangle(Shape):
|
|
252
|
+
def area(self):
|
|
253
|
+
return self.width * self.height
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Liskov Substitution Principle (LSP)
|
|
257
|
+
|
|
258
|
+
Subtypes must be substitutable for their base types:
|
|
259
|
+
|
|
260
|
+
```python
|
|
261
|
+
# BAD: Square violates LSP
|
|
262
|
+
class Rectangle:
|
|
263
|
+
def set_width(self, width):
|
|
264
|
+
self.width = width
|
|
265
|
+
|
|
266
|
+
def set_height(self, height):
|
|
267
|
+
self.height = height
|
|
268
|
+
|
|
269
|
+
class Square(Rectangle):
|
|
270
|
+
def set_width(self, width):
|
|
271
|
+
self.width = width
|
|
272
|
+
self.height = width # Violates expectation
|
|
273
|
+
|
|
274
|
+
def set_height(self, height):
|
|
275
|
+
self.height = height
|
|
276
|
+
self.width = height
|
|
277
|
+
|
|
278
|
+
# GOOD: Separate hierarchies
|
|
279
|
+
class Shape(ABC):
|
|
280
|
+
@abstractmethod
|
|
281
|
+
def area(self):
|
|
282
|
+
pass
|
|
283
|
+
|
|
284
|
+
class Rectangle(Shape):
|
|
285
|
+
def __init__(self, width, height):
|
|
286
|
+
self.width = width
|
|
287
|
+
self.height = height
|
|
288
|
+
|
|
289
|
+
def area(self):
|
|
290
|
+
return self.width * self.height
|
|
291
|
+
|
|
292
|
+
class Square(Shape):
|
|
293
|
+
def __init__(self, side):
|
|
294
|
+
self.side = side
|
|
295
|
+
|
|
296
|
+
def area(self):
|
|
297
|
+
return self.side ** 2
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Dependency Inversion Principle (DIP)
|
|
301
|
+
|
|
302
|
+
Depend on abstractions, not concretions:
|
|
303
|
+
|
|
304
|
+
```python
|
|
305
|
+
# BAD: Direct dependency on concrete class
|
|
306
|
+
class OrderService:
|
|
307
|
+
def __init__(self):
|
|
308
|
+
self.db = PostgreSQLDatabase()
|
|
309
|
+
|
|
310
|
+
def save(self, order):
|
|
311
|
+
self.db.save(order)
|
|
312
|
+
|
|
313
|
+
# GOOD: Depend on abstraction
|
|
314
|
+
class Database(ABC):
|
|
315
|
+
@abstractmethod
|
|
316
|
+
def save(self, entity):
|
|
317
|
+
pass
|
|
318
|
+
|
|
319
|
+
class OrderService:
|
|
320
|
+
def __init__(self, db: Database):
|
|
321
|
+
self.db = db
|
|
322
|
+
|
|
323
|
+
def save(self, order):
|
|
324
|
+
self.db.save(order)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## Code Smells to Fix
|
|
328
|
+
|
|
329
|
+
| Smell | Solution |
|
|
330
|
+
|-------|----------|
|
|
331
|
+
| Long methods | Extract to smaller methods |
|
|
332
|
+
| Large classes | Split into focused classes |
|
|
333
|
+
| Duplicated code | Extract to shared method |
|
|
334
|
+
| Feature envy | Move method to data class |
|
|
335
|
+
| Data clumps | Introduce parameter object |
|
|
336
|
+
| Primitive obsession | Replace with value objects |
|
|
337
|
+
| Switch statements | Use polymorphism |
|
|
338
|
+
| Parallel inheritance | Merge hierarchies |
|
|
339
|
+
| Lazy class | Remove or inline |
|
|
340
|
+
| Speculative generality | Remove unused abstractions |
|
|
341
|
+
|
|
342
|
+
## Refactoring Checklist
|
|
343
|
+
|
|
344
|
+
1. [ ] Tests exist before refactoring
|
|
345
|
+
2. [ ] Small, incremental changes
|
|
346
|
+
3. [ ] Commit after each successful refactor
|
|
347
|
+
4. [ ] Run tests after each change
|
|
348
|
+
5. [ ] Use IDE refactoring tools
|
|
349
|
+
6. [ ] Check code coverage maintained
|