Facebook Pixel
Searching...
Български
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Clean Code

Clean Code

A Handbook of Agile Software Craftsmanship
от Robert C. Martin 2007 464 страници
4.37
22k+ оценки
Слушай
Listen to Summary

ключови извода

1. Пишете чист код, който е четим и поддържан

Единственото валидно измерване на качеството на кода: WTFs/минута

Четливостта е от съществено значение. Чистият код трябва да бъде лесно разбираем от другите разработчици. Той трябва да бъде прост, елегантен и без излишни елементи. Стремете се да пишете код, който ясно изразява намерението си, без нужда от обширни коментари. Използвайте смислени имена на променливи и функции, поддържайте функциите малки и фокусирани, и организирайте кода логично.

Поддръжката позволява еволюция. Кодът, който е труден за промяна, става бреме. Проектирайте кода си да бъде гъвкав и модулен, за да може да се адаптира към променящите се изисквания. Следвайте принципи като DRY (Не повтаряйте се) и SOLID, за да създадете слабо свързани, но силно свързани системи. Рефакторирайте безмилостно, за да подобрите структурата на кода, без да променяте поведението.

Чистият код се отплаща. Въпреки че писането на чист код изисква повече усилия в началото, то спестява значително време и главоболия в дългосрочен план. Чистият код е по-лесен за отстраняване на грешки, разширяване и поддръжка. Той позволява на разработчиците да работят по-ефективно и намалява риска от въвеждане на бъгове по време на промени. Направете чистия код основна част от практиката си на разработка.

2. Следвайте смислени конвенции за именуване

Името на променлива, функция или клас трябва да отговаря на всички важни въпроси. То трябва да обяснява защо съществува, какво прави и как се използва.

Използвайте имена, които разкриват намерението. Избирайте имена, които ясно предават целта и поведението на променливи, функции и класове. Избягвайте имена с една буква или криптични съкращения. Използвайте произносими имена, които могат да бъдат лесно търсени. Например:

  • Лошо: d (изминало време в дни)
  • Добро: elapsedTimeInDays

Бъдете последователни и точни. Използвайте последователни конвенции за именуване в целия код. Бъдете точни, за да избегнете неясноти - например, използвайте смислени различия като getActiveAccounts() и getActiveAccountInfo(). Избягвайте кодировки или префикси, които добавят шум без стойност. Имената на класовете трябва да бъдат съществителни, а имената на методите - глаголи.

Дължината на името трябва да съответства на обхвата. Използвайте по-дълги, по-описателни имена за променливи и функции с по-голям обхват. Кратките имена са приемливи за малки, локални обхвати. Дължината на името трябва да бъде пропорционална на обхвата на употреба. Оптимизирайте за четливост и разбиране в контекста, в който се използва името.

3. Дръжте функциите малки и фокусирани

Функциите трябва да правят едно нещо. Те трябва да го правят добре. Те трябва да го правят само.

Малкото е красиво. Функциите трябва да са малки - обикновено 5-10 реда. Те трябва да се побират на един екран и да бъдат моментално разбираеми. Извличайте код в добре именувани помощни функции, вместо да пишете дълги, сложни функции. Малките функции са по-лесни за разбиране, тестване и поддръжка.

Правете едно нещо добре. Всяка функция трябва да има една единствена, ясна цел. Ако функцията прави множество неща, извлечете ги в отделни функции. Признаци, че функцията прави твърде много, включват:

  • Множество нива на абстракция
  • Множество секции или кодови блокове
  • Множество параметри

Поддържайте едно ниво на абстракция. Изявленията в рамките на функцията трябва да бъдат на едно и също ниво на абстракция. Не смесвайте логика на високо ниво с детайли на ниско ниво. Извлечете операции на по-ниско ниво в отделни функции. Това подобрява четливостта, като поддържа функциите фокусирани и концептуално прости.

4. Практикувайте правилно форматиране и организация

Форматирането на кода е свързано с комуникацията, а комуникацията е основната задача на професионалния разработчик.

Последователното форматиране е важно. Използвайте последователно отстъп, разчупвания на редове и разстояния в целия код. Това подобрява четливостта и намалява когнитивното натоварване. Съгласувайте стандартите за форматиране с екипа си и използвайте автоматизирани инструменти, за да ги наложите. Основни насоки за форматиране включват:

  • Правилен отстъп
  • Последователно разположение на скобите
  • Логични разчупвания на редовете
  • Подходящо разстояние

Организирайте кода логично. Групирайте свързания код заедно и отделяйте несвързания код. Използвайте празни редове, за да създадете "параграфни" паузи между логичните секции. Поставяйте свързани функции близо една до друга. Дръжте файловете фокусирани върху един единствен концепт или компонент. Разделяйте големите файлове на по-малки, по-фокусирани, когато е уместно.

Следвайте стандартни конвенции. Придържайте се към стандартни конвенции за вашия език и общност. Това прави кода ви по-познат и достъпен за другите разработчици. Например, в Java:

  • Имената на класовете използват PascalCase
  • Имената на методите използват camelCase
  • Константите използват ALL_CAPS

5. Управлявайте зависимостите и избягвайте дублирането

Дублирането може да бъде коренът на всичкото зло в софтуера.

Премахнете дублирането. Дублираният код е пропусната възможност за абстракция. Когато видите дублиране, извлечете общия код в повторно използваема функция или клас. Това подобрява поддръжката, като центрира логиката и намалява риска от несъответстващи промени. Внимание към видовете дублиране:

  • Идентични кодови блокове
  • Подобни алгоритми с малки вариации
  • Повторени switch/case или if/else вериги

Внимателно управлявайте зависимостите. Минимизирайте зависимостите между модулите, за да намалите свързаността. Използвайте инжектиране на зависимости и инверсия на контрола, за да направите кода по-модулен и тестван. Следвайте принципа на инверсия на зависимостите - разчитайте на абстракции, а не на конкретики. Това прави кода ви по-гъвкав и по-лесен за промяна.

Използвайте принципа на най-малкото познание. Един модул не трябва да знае за вътрешностите на обектите, които манипулира. Това намалява свързаността между модулите. Например, използвайте Закона на Деметър - методът трябва да извиква методи само на:

  • Своя собствен обект
  • Обекти, предадени като параметри
  • Обекти, които създава
  • Преки компоненти на обекта си

6. Обработвайте грешките елегантно

Обработката на грешки е важна, но ако затруднява логиката, е грешна.

Използвайте изключения вместо кодове за грешки. Изключенията са по-чисти и не замърсяват основната логика на кода ви. Те позволяват обработката на грешки да бъде отделена от щастливия път. Когато използвате изключения:

  • Създавайте информативни съобщения за грешки
  • Осигурявайте контекст с изключения
  • Определяйте класове на изключения въз основа на нуждите на извикващия

Не връщайте null. Връщането на null води до изключения с нулеви указатели и замърсява кода с проверки за null. Вместо това:

  • Връщайте празни колекции вместо null за списъци
  • Използвайте шаблона Null Object
  • Използвайте Optional в Java или Maybe в функционални езици

Пишете try-catch-finally изявления първо. Започнете с try-catch-finally, когато пишете код, който може да хвърли изключения. Това помага да се определи обхватът и очакванията за извикващия код. То осигурява правилно управление и освобождаване на ресурси, дори в сценарии на грешки.

7. Пишете задълбочени модулни тестове

Тестовият код е също толкова важен, колкото и производственият код.

Следвайте трите закона на TDD. Разработката, ръководена от тестове (TDD), подобрява качеството и дизайна на кода:

  1. Напишете неуспешен тест преди да напишете какъвто и да е производствен код
  2. Напишете само толкова от теста, за да демонстрирате неуспех
  3. Напишете само толкова производствен код, за да преминете теста

Дръжте тестовете чисти и поддържани. Прилагайте същите стандарти за качество на кода към тестовете си, както и към производствения код. Рефакторирайте и подобрявайте тестовия код редовно. Добре структурираните тестове служат като документация и позволяват безстрашно рефакториране на производствения код.

Стремете се към обширно покритие на тестовете. Пишете тестове, които обхващат крайни случаи, гранични условия и сценарии на грешки - не само щастливия път. Използвайте инструменти за покритие на кода, за да идентифицирате пропуски в покритието на тестовете. Помнете, че 100% покритие не гарантира безгрешен код, но предоставя увереност при рефакториране и промени.

8. Рефакторирайте кода непрекъснато

Оставете къмпинга по-чист, отколкото го намерихте.

Рефакторирайте при всяка възможност. Подобрявайте структурата на кода всеки път, когато работите върху парче код. Следвайте правилото на скаутите: оставете кода по-добър, отколкото сте го намерили. Малките, инкрементални подобрения се натрупват с времето и предотвратяват разпад на кода. Чести техники за рефакториране включват:

  • Извличане на методи или класове
  • Преименуване за яснота
  • Оптимизиране на сложни условия
  • Премахване на дублиране

Рефакторирайте безопасно с тестове. Винаги имайте солидна тестова среда преди рефакториране. Правете малки, инкрементални промени и стартирайте тестовете често. Това ви дава увереност, че промените ви не нарушават съществуващата функционалност. Използвайте автоматизирани инструменти за рефакториране, когато са налични, за да намалите риска от въвеждане на грешки.

Баланс между рефакториране и предоставяне на стойност. Въпреки че непрекъснатото рефакториране е важно, не позволявайте то да парализира напредъка. Стремете се към "достатъчно добро", а не към съвършенство. Фокусирайте усилията си за рефакториране върху най-проблематичните или често променяни области на кода. Комуникирайте стойността на рефакториране на заинтересованите страни, за да осигурите подкрепа за продължаващото подобряване на кода.

9. Прилагайте принципите на обектно-ориентирано и функционално програмиране

Обектите скриват данните си зад абстракции и излагат функции, които работят с тези данни. Данните структури излагат данните си и нямат смислени функции.

Използвайте принципите на обектно-ориентираното програмиране разумно. Прилагайте принципи като инкапсулация, наследяване и полиморфизъм, за да създадете гъвкави, модулни дизайни. Следвайте принципите SOLID:

  • Принцип на единствената отговорност
  • Принцип на отвореност-затвореност
  • Принцип на заместване на Лисков
  • Принцип на разделение на интерфейса
  • Принцип на инверсия на зависимостите

Използвайте концепции от функционалното програмиране. Дори в обектно-ориентирани езици, техниките на функционалното програмиране могат да доведат до по-чист код:

  • Чисти функции без странични ефекти
  • Непроменливи данни
  • Функции от по-висок ред
  • Съставяне на функции

Изберете правилния подход за проблема. Обектно-ориентираните и функционалните парадигми имат свои силни и слаби страни. Използвайте обектно-ориентиран дизайн, когато трябва да моделирате сложни домейни с поведение. Използвайте функционални подходи за трансформация на данни и обработка на потоци. Много съвременни езици поддържат хибриден подход, позволявайки ви да използвате най-добрия инструмент за всяка част от системата.

10. Внимателно обмисляйте конкурентността

Конкурентността е стратегия за декуплиране. Тя ни помага да отделим какво се прави от кога се прави.

Разберете предизвикателствата на конкурентността. Конкурентното програмиране въвежда сложност и потенциал за фини грешки. Чести проблеми включват:

  • Условия на състезание
  • Задръствания
  • Пропуснати сигнали
  • Проблеми с видимостта на паметта

Отделете проблемите с конкурентността. Дръжте кода, свързан с конкурентността, отделен от другия код. Това улеснява разсъжденията и тестването. Използвайте абстракции като Executors, Futures и Actors, за да управлявате конкурентността, вместо да работите с сурови нишки.

Предпочитайте непроменливост и чисти функции. Непроменливите обекти и чистите функции са по същество безопасни за нишки. Те елиминират много проблеми с конкурентността, като избягват споделено изменяемо състояние. Когато изменяемото състояние е необходимо, използвайте подходящи техники за синхронизация и обмислете използването на атомни променливи или конкурентни колекции.

Последна актуализация:

FAQ

What's "Clean Code: A Handbook of Agile Software Craftsmanship" about?

  • Focus on Clean Code: "Clean Code" by Robert C. Martin emphasizes writing code that is easy to read, understand, and maintain.
  • Professionalism in Coding: It argues that clean code is a hallmark of professionalism in software development.
  • Practical Advice: The book provides guidelines, examples, and case studies to help developers write clean and efficient code.

Why should I read "Clean Code: A Handbook of Agile Software Craftsmanship"?

  • Improve Coding Skills: It teaches how to write code that is clean, efficient, and maintainable.
  • Learn from Experts: Part of the Robert C. Martin series, known for its technical and pragmatic approach.
  • Long-term Benefits: Writing clean code reduces maintenance costs and makes you a more valuable developer.

What are the key takeaways of "Clean Code: A Handbook of Agile Software Craftsmanship"?

  • Code Readability: Emphasizes that code should be easy to read and understand.
  • Single Responsibility Principle: Advocates for each class or function to have one reason to change.
  • Continuous Improvement: Encourages developers to continuously improve their code, following the Boy Scout Rule.

How does "Clean Code: A Handbook of Agile Software Craftsmanship" define clean code?

  • Elegance and Efficiency: Clean code is described as elegant and efficient, with minimal dependencies.
  • Readable and Maintainable: It should read like well-written prose, making the designer's intent clear.
  • Focused and Single-minded: Each function, class, and module should have a single, clear purpose.

What is the Single Responsibility Principle in "Clean Code: A Handbook of Agile Software Craftsmanship"?

  • One Reason to Change: A class or module should have one, and only one, reason to change.
  • Improves Cohesion: Ensures that classes are cohesive, with closely related methods and variables.
  • Facilitates Maintenance: Makes the code easier to maintain and extend, reducing the impact of changes.

What is the "Boy Scout Rule" mentioned in "Clean Code: A Handbook of Agile Software Craftsmanship"?

  • Continuous Improvement: Suggests leaving the codebase cleaner than you found it.
  • Small, Incremental Changes: Encourages making small improvements, like renaming variables or breaking up functions.
  • Professional Responsibility: Presented as a professional responsibility to ensure maintainability.

How does "Clean Code: A Handbook of Agile Software Craftsmanship" approach Test-Driven Development (TDD)?

  • Fundamental Discipline: TDD is crucial for writing clean, reliable code.
  • Three Laws of TDD: Write a failing test first, write code to pass the test, then refactor.
  • Benefits: Helps catch bugs early and improves code design.

What are "code smells" according to "Clean Code: A Handbook of Agile Software Craftsmanship"?

  • Definition: Indicators of potential problems that hinder readability or maintainability.
  • Examples: Long methods, large classes, and duplicated code.
  • Addressing Smells: Provides heuristics and refactoring techniques to improve code quality.

How does "Clean Code: A Handbook of Agile Software Craftsmanship" suggest handling exceptions?

  • Prefer Exceptions: Use exceptions instead of error codes for better context and management.
  • Provide Context: Include meaningful messages and context when throwing exceptions.
  • Avoid Checked Exceptions: Suggests using unchecked exceptions for cleaner code.

What role do unit tests play in "Clean Code: A Handbook of Agile Software Craftsmanship"?

  • Ensure Code Quality: Unit tests ensure code works as intended and remains maintainable.
  • Test-Driven Development: Advocates writing tests before production code.
  • Clean and Readable Tests: Tests should be as clean and readable as production code.

What is the role of refactoring in "Clean Code: A Handbook of Agile Software Craftsmanship"?

  • Continuous Improvement: Refactoring improves code structure and readability without changing functionality.
  • Techniques: Provides techniques like Extract Method and Rename Variable to enhance code quality.
  • Fearless Refactoring: With comprehensive tests, developers can refactor confidently.

What are the best quotes from "Clean Code: A Handbook of Agile Software Craftsmanship" and what do they mean?

  • "Clean code does one thing well." Emphasizes focus and clarity in code.
  • "Leave the campground cleaner than you found it." Encourages continuous improvement of the codebase.
  • "You know you are working on clean code when each routine you read turns out to be pretty much what you expected." Highlights the importance of readability and predictability.

Рецензии

4.37 от 5
Средна оценка от 22k+ оценки от Goodreads и Amazon.

„Чист код“ получава предимно положителни отзиви за принципите си относно писането на четим и поддържан код. Читателите оценяват практическите съвети за именуване, функции и тестване. Фокусът на книгата върху Java и някои прекалено строги насоки са чести критики. Много хора я смятат за задължително четиво за разработчици, въпреки че някои я намират за по-малко полезна за опитни програмисти. Казусите и примерите за рефакторинг са похвалени от едни, но критикувани от други като прекалени. В общи линии, рецензентите се съгласяват, че книгата предлага ценни прозрения относно качеството на кода, дори и не всички предложения да са универсално приложими.

За автора

Робърт Сесил Мартин, известен като Дядо Боб, е признат софтуерен инженер и консултант. Той е привърженик на Agile методите за разработка и е президент на Object Mentor Inc. Експертизата на Мартин обхваща Обектно-ориентирано проектиране, Патерни, UML и eXtreme Програмиране. Той е работил с клиенти по целия свят, споделяйки знанията си чрез консултации и участия в конференции. Мартин е бил главен редактор на C++ Report от 1996 до 1999 година. Той е видна фигура в общността на софтуерната разработка, често представяйки на международни конференции и търговски изложения. Влиянието му надхвърля консултантската му работа чрез книгите и статиите му за софтуерно майсторство и най-добри практики.

0:00
-0:00
1x
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Recommendations: Get personalized suggestions
Ratings: Rate books & see your ratings
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
All summaries are free to read in 40 languages
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 10
📜 Unlimited History
Free users are limited to 10
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Mar 21,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
100,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.
Settings
Appearance
Black Friday Sale 🎉
$20 off Lifetime Access
$79.99 $59.99
Upgrade Now →