Học các mẫu prompt đã được chứng minh để hướng AI tới yêu cầu rõ ràng hơn, thiết kế mô-đun, và code có thể kiểm thử—giảm việc refactor và vòng viết lại.

“Kiến trúc sạch hơn” trong bài này không ám chỉ một framework cụ thể hay một sơ đồ hoàn hảo. Nó nghĩa là bạn có thể giải thích hệ thống một cách đơn giản, thay đổi nó mà không làm hỏng phần khác, và xác minh hành vi mà không cần các kiểm thử phi thường.
Rõ ràng nghĩa là mục đích và hình dạng của hệ thống hiển nhiên từ một mô tả ngắn: nó làm gì, ai dùng, dữ liệu xử lý, và những gì nó không bao giờ được làm. Trong công việc có hỗ trợ AI, rõ ràng còn là mô hình có thể lặp lại yêu cầu theo cách bạn sẽ duyệt.
Mô-đun nghĩa là trách nhiệm có ranh giới rõ. Mỗi module có nhiệm vụ riêng, inputs/outputs, và biết rất ít về nội bộ module khác. Khi AI tạo code, mô-đun hóa ngăn việc rải quy tắc nghiệp vụ khắp controllers, UI và data access.
Có thể kiểm thử nghĩa là kiến trúc khiến việc “chứng minh nó hoạt động” trở nên rẻ. Quy tắc nghiệp vụ có thể kiểm thử mà không cần chạy nguyên hệ thống, và kiểm thử tích hợp tập trung vào một vài hợp đồng thay vì mọi đường đi mã.
Việc viết lại phần lớn không phải do “code xấu” — mà do thiếu ràng buộc, phạm vi mơ hồ, và giả định ẩn. Ví dụ:
AI có thể khuếch đại dạng lỗi này bằng cách tạo ra đầu ra thuyết phục rất nhanh, khiến dễ dàng xây dựng lên nền tảng chưa vững.
Những pattern phía trước là mẫu để điều chỉnh, không phải prompt thần kỳ. Mục tiêu thực sự của chúng là buộc những cuộc trò chuyện đúng đắn sớm: làm rõ ràng ràng buộc, so sánh lựa chọn, ghi lại giả định, và định nghĩa hợp đồng. Nếu bạn bỏ qua bước suy nghĩ đó, mô hình sẽ vui vẻ lấp đầy chỗ trống — và bạn sẽ trả giá sau này.
Bạn sẽ dùng chúng xuyên suốt chu trình triển khai:
Nếu bạn đang dùng workflow tạo code bằng vibe-coding (hệ thống sinh và lặp qua chat), những điểm kiểm tra này càng quan trọng. Ví dụ, trong Koder.ai bạn có thể chạy vòng “chế độ lập kế hoạch” để cố định yêu cầu và hợp đồng trước khi sinh code React/Go/PostgreSQL, rồi dùng snapshot/rollback để lặp an toàn khi giả định thay đổi — mà không biến mỗi thay đổi thành viết lại toàn bộ.
Các pattern prompt giá trị nhất là khi chúng giảm sự dao động quyết định. Mẹo là dùng chúng như các điểm kiểm ngắn, có thể lặp lại — trước khi code, khi thiết kế, và trong review — để AI tạo ra artifact bạn có thể tái sử dụng, không phải văn bản thừa bạn phải lọc.
Trước khi code: chạy một vòng “căn chỉnh” để xác nhận mục tiêu, người dùng, ràng buộc và chỉ số thành công.
Trong thiết kế: dùng pattern buộc phải nêu rõ đánh đổi (ví dụ alternatives, rủi ro, ranh giới dữ liệu) trước khi bắt tay triển khai.
Trong review: dùng prompt theo dạng checklist để bắt các khoảng trống (các trường hợp cạnh, giám sát, bảo mật, hiệu năng) khi thay đổi còn rẻ.
Bạn sẽ nhận đầu ra tốt hơn với một gói input nhỏ, nhất quán:
Nếu bạn không biết điều gì, hãy nói rõ và yêu cầu AI liệt kê giả định.
Thay vì “giải thích thiết kế,” yêu cầu các artifact bạn có thể dán vào tài liệu hoặc ticket:
Làm các vòng 10–15 phút: prompt → lướt qua → thắt chặt. Luôn bao gồm tiêu chí chấp nhận (những điều phải đúng để thiết kế được chấp nhận), rồi yêu cầu AI tự kiểm tra theo chúng. Điều này ngăn quá trình biến thành redesign vô tận và làm cho các pattern sau dễ áp dụng hơn.
Phần lớn “viết lại kiến trúc” không phải do sơ đồ xấu — mà là do xây đúng thứ cho vấn đề sai (hoặc không đầy đủ). Khi bạn dùng LLM sớm, đừng hỏi kiến trúc trước. Hãy bắt nó lộ ra sự mơ hồ.
Dùng mô hình như một chuyên viên phân tích yêu cầu. Mục tiêu của bạn là một spec ngắn, ưu tiên mà bạn có thể xác nhận trước khi ai đó thiết kế thành phần, chọn DB, hoặc commit API.
Đây là template có thể copy-paste:
You are my requirements analyst. Before proposing any architecture, do this:
1) Ask 10–15 clarifying questions about missing requirements and assumptions.
- Group questions by: users, workflows, data, integrations, security/compliance, scale, operations.
2) Produce a prioritized scope list:
- Must-have
- Nice-to-have
- Explicitly out-of-scope
3) List constraints I must confirm:
- Performance (latency/throughput targets)
- Cost limits
- Security/privacy
- Compliance (e.g., SOC2, HIPAA, GDPR)
- Timeline and team size
4) End with: “Restate the final spec in exactly 10 bullets for confirmation.”
Context:
- Product idea:
- Target users:
- Success metrics:
- Existing systems (if any):
Bạn muốn các câu hỏi buộc phải đưa ra quyết định (không phải kiểu “nói rõ hơn”), kèm danh sách must-have có thể hoàn thành trong timeline.
Xử lý phần “10 bullets” như một hợp đồng: dán vào ticket/PRD, lấy xác nhận nhanh từ bên liên quan, rồi chỉ sau đó chuyển sang kiến trúc. Bước đơn giản này ngăn nguyên nhân phổ biến nhất của refactor muộn: xây tính năng mà thực ra không cần.
Khi bạn bắt đầu từ công cụ (“Chúng ta nên dùng event sourcing không?”) bạn thường kết thúc bằng việc thiết kế vì kiến trúc thay vì vì người dùng. Con đường nhanh hơn đến cấu trúc sạch là để AI mô tả hành trình người dùng trước bằng ngôn ngữ đơn giản, rồi mới chuyển các hành trình đó thành thành phần, dữ liệu và API.
Dùng làm khởi điểm copy-paste:
Rồi hỏi:
“Mô tả luồng từng bước cho mỗi hành động bằng ngôn ngữ đơn giản.”
“Cung cấp sơ đồ trạng thái đơn giản hoặc danh sách trạng thái (ví dụ: Draft → Submitted → Approved → Archived).”
“Liệt kê các kịch bản không-happy-path: timeout, retry, duplicate requests, cancellations, và input không hợp lệ.”
Khi các flow rõ, bạn có thể yêu cầu AI map chúng tới lựa chọn kỹ thuật:
Chỉ sau đó mới yêu cầu phác thảo kiến trúc (dịch vụ/module, ranh giới, trách nhiệm) gắn trực tiếp với các bước flow.
Kết thúc bằng cách yêu cầu AI chuyển mỗi hành trình thành tiêu chí chấp nhận bạn có thể kiểm thử:
Pattern này giảm viết lại vì kiến trúc phát triển từ hành vi người dùng — không phải từ giả định về công nghệ.
Hầu hết việc sửa đổi kiến trúc không phải do “thiết kế xấu” — mà do giả định ẩn sau đó sai. Khi bạn yêu cầu LLM cho kiến trúc, nó thường lấp đầy khoảng trống bằng các dự đoán hợp lý. Nhật ký giả định làm lộ các dự đoán đó sớm, khi việc thay đổi còn rẻ.
Mục tiêu của bạn là tách rõ ràng giữa sự thật bạn cung cấp và giả định nó tự suy.
Dùng mẫu prompt sau:
Template prompt “Before proposing any solution: list your assumptions. Mark each as validated (explicitly stated by me) or unknown (you inferred it). For each unknown assumption, propose a fast way to validate it (question to ask, metric to check, or quick experiment). Then design based only on validated assumptions, and call out where unknowns could change the design.”
Giữ ngắn để mọi người thực sự dùng:
Thêm một dòng khiến mô hình nói ra các điểm chuyển đổi:
Pattern này biến kiến trúc thành một tập các quyết định có điều kiện. Bạn không chỉ nhận được một sơ đồ — bạn nhận được bản đồ những gì cần xác nhận trước khi cam kết.
Công cụ AI giỏi trong việc tạo một thiết kế “tốt nhất” — nhưng đó thường chỉ là phương án hợp lý đầu tiên. Kiến trúc sạch hơn thường xuất hiện khi bạn ép phải so sánh sớm, khi thay đổi còn rẻ.
Dùng prompt buộc phải có nhiều kiến trúc và một bảng tradeoff có cấu trúc:
Propose 2–3 viable architectures for this project.
Compare them in a table with criteria: complexity, reliability, time-to-ship, scalability, cost.
Then recommend one option for our constraints and explain why it wins.
Finally, list “what we are NOT building” in this iteration to keep scope stable.
Context:
- Users and key journeys:
- Constraints (team size, deadlines, budget, compliance):
- Expected load and growth:
- Current systems we must integrate with:
Việc so sánh buộc mô hình (và bạn) phải lộ ra các giả định ẩn: nơi lưu state, cách dịch vụ giao tiếp, gì phải đồng bộ, và gì có thể trì hoãn.
Bảng tiêu chí quan trọng vì nó dập tắt tranh luận kiểu “microservices vs monolith” trở nên dựa trên quan điểm. Nó neo quyết định vào những điều bạn thực sự quan tâm — ra sản phẩm nhanh, giảm chi phí vận hành, hay cải thiện độ tin cậy.
Đừng chấp nhận “còn tuỳ”. Hãy yêu cầu một khuyến nghị rõ ràng và các ràng buộc cụ thể mà nó tối ưu.
Cũng ép phải có “chúng ta KHÔNG xây” cụ thể. Ví dụ: “Không failover đa vùng”, “Không hệ thống plugin”, “Không thông báo real-time.” Điều này ngăn kiến trúc âm thầm mở rộng để hỗ trợ các tính năng bạn chưa cam kết — và tránh viết lại bất ngờ khi phạm vi thay đổi sau đó.
Phần lớn việc viết lại xảy ra vì ranh giới mơ hồ: mọi thứ “chạm mọi thứ”, và một thay đổi nhỏ lan khắp codebase. Pattern này dùng prompt buộc phải có quyền sở hữu module rõ ràng trước khi ai đó tranh luận framework hay sơ đồ lớp.
Yêu cầu AI định nghĩa module và trách nhiệm, cùng những gì không thuộc từng module. Rồi yêu cầu giao diện (inputs/outputs) và quy tắc phụ thuộc, không phải kế hoạch build hay chi tiết triển khai.
Dùng khi bạn phác thảo tính năng mới hoặc refactor khu vực lộn xộn:
Liệt kê module với:
Với mỗi module, định nghĩa chỉ giao diện:
Quy tắc phụ thuộc:
Bài kiểm tra thay đổi trong tương lai: Với các thay đổi khả dĩ: <liệt 3>, chỉ ra module nào sẽ chịu trách nhiệm hấp thụ từng thay đổi và vì sao.
Bạn muốn module đủ để mô tả cho đồng đội trong chưa đầy 1 phút. Nếu AI đề xuất một module “Utils” hay đặt rule nghiệp vụ vào controllers, hãy phản hồi: “Chuyển quyết định vào module domain và giữ adapters thật mỏng.”
Khi xong, bạn có ranh giới tồn tại khi yêu cầu mới xuất hiện — vì thay đổi có một nơi rõ ràng để xử lý, và quy tắc phụ thuộc ngăn coupling vô ý.
Làm lại tích hợp thường không phải do code xấu — mà do hợp đồng không rõ. Nếu mô hình dữ liệu và hình dạng API được quyết muộn, mọi team (hoặc mọi module) tự lấp chỗ trống khác nhau, và bạn tiêu thời gian sprint sau đó để hoà giải.
Bắt đầu bằng prompt yêu cầu hợp đồng trước khi nói về framework, DB hay microservices. Một hợp đồng rõ ràng trở thành tham chiếu chung giữ UI, backend và pipeline dữ liệu đồng bộ.
Dùng prompt sớm sau đây với trợ lý AI:
Rồi tiếp ngay bằng:
Bạn muốn artifact cụ thể, không phải văn chương. Ví dụ:
Subscription
Và phác thảo API:
POST /v1/subscriptions
{
"customer_id": "cus_123",
"plan_id": "pro_monthly",
"start_date": "2026-01-01"
}
201 Created
{
"id": "sub_456",
"status": "active",
"current_period_end": "2026-02-01"
}
422 Unprocessable Entity
{
"error": {
"code": "VALIDATION_ERROR",
"message": "start_date must be today or later",
"fields": {"start_date": "in_past"}
}
}
Yêu cầu AI nêu các quy tắc như: “Thêm trường là được phép mà không bump version; đổi tên cần /v2; client phải bỏ qua trường không biết.” Bước này ngăn thay đổi phá vỡ âm thầm — và các viết lại theo sau.
Kiến trúc bị viết lại khi thiết kế “happy path” gặp lưu lượng thật, phụ thuộc không ổn định, và hành vi người dùng ngoài dự tính. Pattern này biến độ tin cậy thành một đầu ra thiết kế rõ ràng, không phải việc phải vật lộn sau khi ra mắt.
Dùng cùng mô tả kiến trúc đã chọn:
List failure modes; propose mitigations; define observability signals.
For each failure mode:
- What triggers it?
- User impact (what the user experiences)
- Mitigation (design + operational)
- Retries, idempotency, rate limits, timeouts considerations
- Observability: logs/metrics/traces + alert thresholds
Tập trung bằng cách nêu các interface có thể hỏng: external APIs, database, queues, auth provider, background jobs. Rồi yêu cầu quyết định cụ thể:
Kết thúc prompt với: “Return a simple checklist we can review in 2 minutes.” Một checklist tốt bao gồm: timeout cho phụ thuộc được set, retries có biên, idempotency cho create/charge, backpressure/rate limiting, đường xuống graceful.
Yêu cầu sự kiện quanh khoảnh khắc người dùng (không chỉ nội bộ hệ thống): “user_signed_up”, “checkout_submitted”, “payment_confirmed”, “report_generated”. Cho mỗi thứ, yêu cầu:
Điều này biến độ tin cậy thành artifact thiết kế bạn có thể xác nhận trước khi code tồn tại.
Một cách phổ biến AI-assisted design gây viết lại là khuyến khích kiến trúc “hoàn chỉnh” quá sớm. Cách sửa đơn giản: ép kế hoạch bắt đầu bằng lát cắt có thể dùng nhỏ nhất — cái đem lại giá trị, kiểm chứng thiết kế, và giữ các tùy chọn tương lai mở.
Dùng khi bạn cảm thấy giải pháp đang nở nhanh hơn yêu cầu:
Template: “Propose the smallest usable slice; define success metrics; list follow-ups.”
Yêu cầu mô hình trả lời với:
Thêm hướng dẫn: “Give a phased roadmap: MVP → v1 → v2, and explain what risk each phase reduces.” Điều này giữ ý tưởng sau này hiển nhiên nhưng không ép chúng vào release đầu.
Ví dụ kết quả bạn muốn:
Câu mạnh nhất trong pattern này là: “List what is explicitly out of scope for MVP.” Các loại trừ bảo vệ quyết định kiến trúc khỏi sự phức tạp sớm.
Ví dụ loại trừ tốt:
Cuối cùng: “Convert the MVP into tickets, each with acceptance criteria and dependencies.” Điều này buộc rõ ràng và lộ các coupling ẩn.
Tổng quan ticket tốt thường gồm:
Nếu muốn, yêu cầu mô hình xuất theo format team bạn (ví dụ: trường kiểu Jira) và giữ các pha sau như backlog riêng.
Cách đơn giản để ngăn kiến trúc trôi dạt là bắt sự rõ ràng bằng test trước khi hỏi thiết kế. Khi bạn prompt LLM viết test chấp nhận trước, nó phải đặt tên hành vi, inputs, outputs và các trường hợp cạnh. Điều đó lộ ra thiếu yêu cầu và đẩy triển khai hướng tới ranh giới module rõ.
Dùng như prompt “cửa”:
Theo sau bằng: “Group the tests by module responsibility (API layer, domain logic, persistence, external integrations). For each group, specify what is mocked and what is real.”
Điều này nudges LLM tránh thiết kế rối nơi mọi thứ chạm mọi thứ. Nếu nó không thể giải thích nơi bắt đầu kiểm thử tích hợp, có lẽ kiến trúc chưa đủ rõ.
Yêu cầu: “Propose a test data plan: fixtures vs factories, how to generate edge cases, and how to keep tests deterministic. List which dependencies can use in-memory fakes and which require a real service in CI.”
Bạn thường phát hiện một tính năng “đơn giản” thực ra cần hợp đồng, dataset seed, hoặc ID ổn định — tốt hơn là tìm ra bây giờ thay vì lúc viết lại.
Kết thúc với checklist nhẹ:
Review thiết kế không nên chỉ diễn ra sau khi code tồn tại. Với AI, bạn có thể chạy một “pre-mortem review” trên bản nháp kiến trúc (thậm chí chỉ vài đoạn văn và sơ đồ bằng lời) và nhận danh sách cụ thể các điểm yếu trước khi chúng thành viết lại.
Bắt đầu với tư thế reviewer thẳng thắn và ép sự cụ thể:
Prompt: “Act as a reviewer; list risks, inconsistencies, and missing details in this design. Be concrete. If you can’t evaluate something, say what information is missing.”
Dán tóm tắt thiết kế, ràng buộc (ngân sách, timeline, kỹ năng đội), và bất kỳ yêu cầu phi chức năng nào (độ trễ, khả dụng, compliance).
Review thất bại khi phản hồi mơ hồ. Yêu cầu một danh sách sửa đổi theo thứ tự ưu tiên:
Prompt: “Give me a prioritized punch list. For each item: severity (Blocker/High/Medium/Low), why it matters, suggested fix, and the smallest validation step.”
Điều này tạo ra tập task sẵn quyết định thay vì tranh luận.
Một hàm ép hữu ích là điểm số đơn giản:
Prompt: “Assign a rewrite risk score from 1–10. Explain the top 3 drivers. What would reduce the score by 2 points with minimal effort?”
Bạn không cần độ chính xác; mục tiêu là lộ ra các giả định dễ dẫn đến viết lại.
Cuối cùng, ngăn review mở rộng phạm vi:
Prompt: “Provide a diff plan: minimal changes needed to reach the target design. List what stays the same, what changes, and any breaking impacts.”
Khi bạn lặp pattern này trên mỗi vòng, kiến trúc tiến triển qua các bước nhỏ có thể đảo ngược — và các vấn đề lớn bị phát hiện sớm.
Dùng gói này như một workflow nhẹ lập lại cho mỗi tính năng. Ý tưởng là xâu chuỗi các prompt để mỗi bước tạo artifact bước sau có thể dùng — giảm “mất ngữ cảnh” và viết lại bất ngờ.
Trong thực tế, đội thường triển khai chuỗi này như một “feature recipe” lặp lại. Nếu bạn xây với Koder.ai, cấu trúc này ánh xạ tốt vào quy trình chat-driven: lưu artifacts ở một nơi, sinh lát cắt làm việc đầu tiên, rồi lặp với snapshot để thí nghiệm có thể đảo ngược. Khi MVP sẵn sàng, bạn có thể xuất source code hoặc deploy/host với domain tuỳ chỉnh — hữu ích khi bạn muốn tốc độ của AI-assisted delivery mà không bị khóa vào một môi trường duy nhất.
SYSTEM (optional)
You are a software architecture assistant. Be practical and concise.
Guardrail: When you make a recommendation, cite the specific lines from *my input* you relied on by quoting them verbatim under “Input citations”. Do not cite external sources or general industry claims.
If something is unknown, ask targeted questions.
1) REQUIREMENTS CLARIFIER
Context: <product/system overview>
Feature: <feature name>
My notes: <paste bullets, tickets, constraints>
Task:
- Produce: (a) clarified requirements, (b) non-goals, (c) constraints, (d) open questions.
- Include “Input citations” quoting the exact parts of my notes you used.
2) ARCHITECTURE OPTIONS
Using the clarified requirements above, propose 3 architecture options.
For each: tradeoffs, complexity, risks, and when to choose it.
End with a recommendation + “Input citations”.
3) MODULAR BOUNDARIES
Chosen option: <option name>
Define modules/components and their responsibilities.
- What each module owns (and does NOT own)
- Key interfaces between modules
- “Input citations”
4) DATA & API CONTRACTS
For each interface, define a contract:
- Request/response schema (or events)
- Validation rules
- Versioning strategy
- Error shapes
- “Input citations”
5) TEST-FIRST ACCEPTANCE
Write:
- Acceptance criteria (Given/When/Then)
- 5–10 critical tests (unit/integration)
- What to mock vs not mock
- “Input citations”
6) RELIABILITY + DESIGN REVIEW
Create:
- Failure modes list (timeouts, partial failure, bad data, retries)
- Observability plan (logs/metrics/traces)
- Review checklist tailored to this feature
- “Input citations”
If you want a deeper companion, see /blog/prompting-for-code-reviews. If you’re evaluating tooling or team rollout, /pricing is a practical next stop.
"Kiến trúc sạch hơn" ở đây nghĩa là bạn có thể:
Trong công việc có hỗ trợ AI, còn có nghĩa là mô hình có thể tóm tắt lại yêu cầu theo cách bạn có thể chấp nhận.
AI có thể tạo ra code và thiết kế thuyết phục rất nhanh, khiến việc xây dựng trên nền tảng không đầy đủ trở nên dễ dàng — và điều đó khuếch đại các nguyên nhân dẫn đến viết lại như:
Giải pháp không phải là “dùng ít AI hơn” mà là dùng các prompt buộc phải lộ ra ràng buộc, hợp đồng và giả định từ sớm.
Dùng các pattern như các điểm kiểm ngắn tạo ra đầu ra có thể tái sử dụng (không phải văn bản dài):
Giữ vòng lặp ngắn: 10–15 phút: prompt → lướt qua → tinh chỉnh → tự kiểm tra theo tiêu chí chấp nhận.
Mang theo một gói input nhỏ, nhất quán:
Nếu có chỗ chưa biết, nói rõ và yêu cầu mô hình thay vì tự đoán ngầm.
Yêu cầu các artifact có thể dán thẳng vào tài liệu, ticket hoặc PR, ví dụ:
Những đầu ra này làm cho output của AI có thể hành động được và giảm công việc sửa lại do “mất ngữ cảnh”.
Dùng mô hình như một người phỏng vấn yêu cầu. Yêu cầu nó:
Bắt đầu với vai trò và hành động, rồi yêu cầu:
Chỉ khi các luồng rõ ràng, hãy map chúng tới các quyết định như: nơi validation kết thúc và business rule bắt đầu, nơi cần idempotency, và dữ liệu nào cần lưu so với dữ liệu có thể suy ra. Sau đó chuyển các luồng thành tiêu chí chấp nhận dạng Given/When/Then.
LLM thường sẽ lấp đầy khoảng trống bằng các giả định hợp lý nếu bạn không tách biệt giữa:
Yêu cầu một nhật ký giả định đánh dấu mỗi mục là validated hoặc unknown, cùng với:
Bắt mô hình phải đề xuất 2–3 kiến trúc khả thi và so sánh chúng trong một bảng theo tiêu chí: độ phức tạp, độ tin cậy, thời gian ra sản phẩm, khả năng mở rộng, chi phí. Sau đó yêu cầu:
Cách làm này ngăn lựa chọn ban đầu (thường là plausibly tốt) trở thành mặc định và hạn chế việc phạm vi nở ra âm thầm — một nguyên nhân phổ biến dẫn tới viết lại.
Phương pháp theo hợp đồng (contract-first) giảm việc làm lại tích hợp bằng cách làm rõ hình dạng dữ liệu và quy tắc tương thích:
Khi UI, backend và tích hợp cùng dùng artifact hợp đồng này, bạn sẽ ít phải dành thời gian chỉnh cho các giả định lệch nhau sau đó.
Xem đoạn tóm tắt 10 điểm đó như một hợp đồng: dán vào ticket/PR, lấy xác nhận nhanh từ các bên liên quan trước khi bắt đầu thiết kế.
Cũng hỏi: “Điều gì sẽ thay đổi câu trả lời của bạn?” (ví dụ: khối lượng, mục tiêu độ trễ, nhu cầu tuân thủ, quy tắc lưu trữ) để làm cho thiết kế mang tính điều kiện và ít bị viết lại.