<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Code Smells Catalog</title><description>A comprehensive catalog of 56 code smells — structured, browsable reference for developers and researchers.</description><link>https://codesmells.org/</link><item><title>Afraid To Fail</title><link>https://codesmells.org/smells/afraid-to-fail/</link><guid isPermaLink="true">https://codesmells.org/smells/afraid-to-fail/</guid><description>Every caller has to check whether things actually worked, because this code returns status codes instead of throwing exceptions. The defensive ifs cascade up the entire call chain.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Alternative Classes with Different Interfaces</title><link>https://codesmells.org/smells/alternative-classes-with-different-interfaces/</link><guid isPermaLink="true">https://codesmells.org/smells/alternative-classes-with-different-interfaces/</guid><description>Two classes. Same job. Different spelling. One says hug_zombie(), the other says hug_snowman(), and neither realizes they&apos;re duplicating logic behind method names that could share a single interface.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Base Class depends on Subclass</title><link>https://codesmells.org/smells/base-class-depends-on-subclass/</link><guid isPermaLink="true">https://codesmells.org/smells/base-class-depends-on-subclass/</guid><description>When a parent class reaches down to reference its own children, the inheritance tree grows upside down. Change a leaf, redeploy the trunk.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Binary Operator in Name</title><link>https://codesmells.org/smells/binary-operator-in-name/</link><guid isPermaLink="true">https://codesmells.org/smells/binary-operator-in-name/</guid><description>If a method has &quot;and&quot; or &quot;or&quot; in its name, it&apos;s confessing to doing two things, and that confession is an invitation to split it in half.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Boolean Blindness</title><link>https://codesmells.org/smells/boolean-blindness/</link><guid isPermaLink="true">https://codesmells.org/smells/boolean-blindness/</guid><description>Does filter(true) mean take or drop? When a function operates on raw booleans, it destroys the information about what those values represent. The type system knows; the reader doesn&apos;t.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Callback Hell</title><link>https://codesmells.org/smells/callback-hell/</link><guid isPermaLink="true">https://codesmells.org/smells/callback-hell/</guid><description>Nested callbacks indented so deep the closing brackets cascade like a staircase to nowhere. The actual logic hides somewhere around indent level five.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Clever Code</title><link>https://codesmells.org/smells/clever-code/</link><guid isPermaLink="true">https://codesmells.org/smells/clever-code/</guid><description>Code that works but makes you feel stupid for not understanding it. Reinvented built-ins, abused language quirks, logic compacted into one-liners that nobody else can maintain.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Combinatorial Explosion</title><link>https://codesmells.org/smells/combinatorial-explosion/</link><guid isPermaLink="true">https://codesmells.org/smells/combinatorial-explosion/</guid><description>Dozens of methods that do almost the same thing, each differing by one small detail. Add a new feature and the count multiplies again. Good luck remembering which variant handles which edge case.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Complicated Boolean Expression</title><link>https://codesmells.org/smells/complicated-boolean-expression/</link><guid isPermaLink="true">https://codesmells.org/smells/complicated-boolean-expression/</guid><description>Reading it feels like solving a discrete math problem. The if-statement just checks whether a timer expired, but between the negations and conjunctions, you&apos;d never guess that at a glance.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Complicated Regex Expression</title><link>https://codesmells.org/smells/complicated-regex-expression/</link><guid isPermaLink="true">https://codesmells.org/smells/complicated-regex-expression/</guid><description>A regex pattern so dense it needs an online decomposer to parse. Named variables and a builder function would make the same expression self-documenting.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Conditional Complexity</title><link>https://codesmells.org/smells/conditional-complexity/</link><guid isPermaLink="true">https://codesmells.org/smells/conditional-complexity/</guid><description>The if/else chain that grows a new branch with every feature. First it&apos;s readable. Then it&apos;s manageable. Then it&apos;s a 200-line switch statement, and suddenly the polymorphism refactor everyone avoided is the only option left.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Data Clump</title><link>https://codesmells.org/smells/data-clump/</link><guid isPermaLink="true">https://codesmells.org/smells/data-clump/</guid><description>red, green, and blue passed separately to every function that needs a color. The same variables travel together everywhere, never packaged into the object they&apos;re quietly begging to become.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Dead Code</title><link>https://codesmells.org/smells/dead-code/</link><guid isPermaLink="true">https://codesmells.org/smells/dead-code/</guid><description>You read past it wondering if it&apos;s safe to delete. Unreachable branches, commented-out blocks, functions that last ran in 2019. They cost nothing at runtime but tax every developer who encounters them.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Divergent Change</title><link>https://codesmells.org/smells/divergent-change/</link><guid isPermaLink="true">https://codesmells.org/smells/divergent-change/</guid><description>A class that changes for database reasons on Monday, calculation reasons on Wednesday, and display reasons on Friday. Same file, different reasons, and the merge conflicts pile up every sprint.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Dubious Abstraction</title><link>https://codesmells.org/smells/dubious-abstraction/</link><guid isPermaLink="true">https://codesmells.org/smells/dubious-abstraction/</guid><description>A method that orchestrates a business workflow but also opens its own database connection, mixing strategy with plumbing until you can&apos;t tell what level of abstraction you&apos;re reading.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Duplicated Code</title><link>https://codesmells.org/smells/duplicated-code/</link><guid isPermaLink="true">https://codesmells.org/smells/duplicated-code/</guid><description>The same logic in five places. Change one, miss another, and watch the behavior quietly diverge. According to Fowler, this is the single worst smell in a codebase.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Fallacious Comment</title><link>https://codesmells.org/smells/fallacious-comment/</link><guid isPermaLink="true">https://codesmells.org/smells/fallacious-comment/</guid><description>A comment that was true once but now lies. The code changed, the comment didn&apos;t, and there&apos;s no linter that catches the drift.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Fallacious Method Name</title><link>https://codesmells.org/smells/fallacious-method-name/</link><guid isPermaLink="true">https://codesmells.org/smells/fallacious-method-name/</guid><description>getItems() returns a single item. isValid() returns a string. setValue() quietly returns a value too. Method names that betray every convention programmers have built over decades.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Fate over Action</title><link>https://codesmells.org/smells/fate-over-action/</link><guid isPermaLink="true">https://codesmells.org/smells/fate-over-action/</guid><description>A class that holds data but owns none of the behavior operating on it. External code reaches in, pulls values out, and makes decisions the object never learned to make for itself.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Feature Envy</title><link>https://codesmells.org/smells/feature-envy/</link><guid isPermaLink="true">https://codesmells.org/smells/feature-envy/</guid><description>A method that touches another class&apos;s fields more than its own. It was written in the wrong place and belongs closer to the data it can&apos;t stop reaching for.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Flag Argument</title><link>https://codesmells.org/smells/flag-argument/</link><guid isPermaLink="true">https://codesmells.org/smells/flag-argument/</guid><description>A boolean parameter that forces the caller to write book(marcel, false) — and everyone who reads it to wonder: false what?</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Global Data</title><link>https://codesmells.org/smells/global-data/</link><guid isPermaLink="true">https://codesmells.org/smells/global-data/</guid><description>Any code, anywhere, can read and write these variables. When something breaks, every function in the codebase is a suspect.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Hidden Dependencies</title><link>https://codesmells.org/smells/hidden-dependencies/</link><guid isPermaLink="true">https://codesmells.org/smells/hidden-dependencies/</guid><description>The class works perfectly in the developer&apos;s environment and crashes in production. You read the stack trace, search every constructor, and find nothing. The dependency was silently resolved from the environment.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Imperative Loops</title><link>https://codesmells.org/smells/imperative-loops/</link><guid isPermaLink="true">https://codesmells.org/smells/imperative-loops/</guid><description>for(i=0; i&lt;len; i++) — the ceremony of manually tracking indexes, accumulating results, and handling off-by-one errors, when a map, filter, or built-in says the same thing in one line.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Inappropriate Static</title><link>https://codesmells.org/smells/inappropriate-static/</link><guid isPermaLink="true">https://codesmells.org/smells/inappropriate-static/</guid><description>Impossible to override. Painful to mock. Silently coupling everything that calls them. Static methods are convenient right up until the behavior needs to vary: then they&apos;re a dead end.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Incomplete Library Class</title><link>https://codesmells.org/smells/incomplete-library-class/</link><guid isPermaLink="true">https://codesmells.org/smells/incomplete-library-class/</guid><description>A third-party library that does 95% of what you need. The missing 5% means building workarounds that duplicate effort, drift from the original, and never feel like first-class code.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Inconsistent Names</title><link>https://codesmells.org/smells/inconsistent-names/</link><guid isPermaLink="true">https://codesmells.org/smells/inconsistent-names/</guid><description>The mental shortcuts that let developers navigate by pattern break when one class calls it store(), another says add(), and a third insists on put(). Same operation. Three names. Zero muscle memory.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Inconsistent Style</title><link>https://codesmells.org/smells/inconsistent-style/</link><guid isPermaLink="true">https://codesmells.org/smells/inconsistent-style/</guid><description>Mixed formatting, flipped parameter orders, and clashing conventions in the same codebase. The code works, but the inconsistency saps trust. If they couldn&apos;t agree on style, what else didn&apos;t they agree on?</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Indecent Exposure</title><link>https://codesmells.org/smells/indecent-exposure/</link><guid isPermaLink="true">https://codesmells.org/smells/indecent-exposure/</guid><description>Everything&apos;s public. Nothing&apos;s hidden. Other modules couple to implementation details they were never meant to see, and now you can&apos;t change a private algorithm without breaking six callers who shouldn&apos;t have known it existed.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Insider Trading</title><link>https://codesmells.org/smells/insider-trading/</link><guid isPermaLink="true">https://codesmells.org/smells/insider-trading/</guid><description>Two classes exchanging private implementation details they shouldn&apos;t have access to — the kind of under-the-table knowledge sharing that makes either one impossible to change without breaking the other.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Large Class</title><link>https://codesmells.org/smells/large-class/</link><guid isPermaLink="true">https://codesmells.org/smells/large-class/</guid><description>The God Class. Too many methods, too many fields, too many reasons to exist. Reading it takes a morning, testing it takes a sprint, and changing it is a gamble that affects everything it touches.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Lazy Element</title><link>https://codesmells.org/smells/lazy-element/</link><guid isPermaLink="true">https://codesmells.org/smells/lazy-element/</guid><description>The meeting that could have been an email — except it&apos;s a class. One field, one method that just delegates to another, an abstraction that costs more in complexity than it ever returns in clarity.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Long Method</title><link>https://codesmells.org/smells/long-method/</link><guid isPermaLink="true">https://codesmells.org/smells/long-method/</guid><description>A method so long you scroll past the beginning before reaching the end. Every change requires re-reading the whole thing, every piece of logic is trapped inside, and the side effects could be hiding three screens away.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Long Parameter List</title><link>https://codesmells.org/smells/long-parameter-list/</link><guid isPermaLink="true">https://codesmells.org/smells/long-parameter-list/</guid><description>Five arguments. Six. Seven. At some point the function signature becomes a riddle, the caller needs a cheat sheet, and the method is clearly trying to do more than one thing.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Magic Number</title><link>https://codesmells.org/smells/magic-number/</link><guid isPermaLink="true">https://codesmells.org/smells/magic-number/</guid><description>A bare 86400 in the code — is that seconds in a day, a timeout, or a config limit? Unnamed numbers hide intent, and when the same literal appears in five places, changing one means hunting for the rest.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Message Chain</title><link>https://codesmells.org/smells/message-chain/</link><guid isPermaLink="true">https://codesmells.org/smells/message-chain/</guid><description>object.getA().getB().getC().getD() — the caller knows the entire relationship chain, and every intermediate link becomes a dependency that breaks when any relationship changes.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Middle Man</title><link>https://codesmells.org/smells/middle-man/</link><guid isPermaLink="true">https://codesmells.org/smells/middle-man/</guid><description>Half its methods just call the same method on another class. It exists, it delegates, and its author can&apos;t explain what it adds. Remove it, and nothing breaks.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Mutable Data</title><link>https://codesmells.org/smells/mutable-data/</link><guid isPermaLink="true">https://codesmells.org/smells/mutable-data/</guid><description>Data that anything can modify at any time. The bug reproduces instantly in production and vanishes in your debugger — by the time you pause execution, something else already changed the value.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Null Check</title><link>https://codesmells.org/smells/null-check/</link><guid isPermaLink="true">https://codesmells.org/smells/null-check/</guid><description>Defensive null checks scattered everywhere like a nervous tic — each one a band-aid over a missing Null Object, and each a reminder that Tony Hoare called his invention a billion-dollar mistake.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Obscured Intent</title><link>https://codesmells.org/smells/obscured-intent/</link><guid isPermaLink="true">https://codesmells.org/smells/obscured-intent/</guid><description>You stare at the function for five minutes before realizing it calculates overtime pay. Between the single-letter variables, the magic numbers, and the missing whitespace, the intent is buried under layers of accidental obfuscation.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Oddball Solution</title><link>https://codesmells.org/smells/oddball-solution/</link><guid isPermaLink="true">https://codesmells.org/smells/oddball-solution/</guid><description>Same problem, two solutions, different files. One uses an adapter, the other rolls its own socket logic, and you can&apos;t tell which approach is the correct one. Or if either is.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Parallel Inheritance Hierarchies</title><link>https://codesmells.org/smells/parallel-inheritance-hierarchies/</link><guid isPermaLink="true">https://codesmells.org/smells/parallel-inheritance-hierarchies/</guid><description>Add a BasicUser, and you need a BasicFunctions. Add a PremiumUser, and here comes PremiumFunctions. Every subclass in one hierarchy demands a mirror in the other, and the cost of every new feature doubles.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Primitive Obsession</title><link>https://codesmells.org/smells/primitive-obsession/</link><guid isPermaLink="true">https://codesmells.org/smells/primitive-obsession/</guid><description>A phone number stored as a string. A price stored as a float. Concepts that deserve their own types get crammed into primitives, losing validation, scattering logic, and pretending a bare string is something it&apos;s not.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Refused Bequest</title><link>https://codesmells.org/smells/refused-bequest/</link><guid isPermaLink="true">https://codesmells.org/smells/refused-bequest/</guid><description>A Tower that extends Minion but throws NotImplemented on move(). The inheritance contract promises full support; the subclass delivers a runtime exception and an apology.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Required Setup or Teardown Code</title><link>https://codesmells.org/smells/required-setup-or-teardown-code/</link><guid isPermaLink="true">https://codesmells.org/smells/required-setup-or-teardown-code/</guid><description>Close the socket when you&apos;re done. Check the environment variables before you start. Reset the state after every call. The object could handle all of this internally. Instead, it made it your problem.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Shotgun Surgery</title><link>https://codesmells.org/smells/shotgun-surgery/</link><guid isPermaLink="true">https://codesmells.org/smells/shotgun-surgery/</guid><description>One small feature change. A dozen files to edit. You submit the PR, then find two more files you missed.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Side Effects</title><link>https://codesmells.org/smells/side-effects/</link><guid isPermaLink="true">https://codesmells.org/smells/side-effects/</guid><description>set_gold(amount) sounds simple enough. Except it also triggers a dancing animation and resets the payday timer. Methods that do more than their name promises hide behavior callers never asked for and debuggers never suspect.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Special Case</title><link>https://codesmells.org/smells/special-case/</link><guid isPermaLink="true">https://codesmells.org/smells/special-case/</guid><description>The if-statement that handles &quot;one weird edge case&quot; before the real logic begins. It was a hotfix once. It was never properly refactored. Now every future reader has to hold that branch in their head alongside everything else.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Speculative Generality</title><link>https://codesmells.org/smells/speculative-generality/</link><guid isPermaLink="true">https://codesmells.org/smells/speculative-generality/</guid><description>An abstract base class for a hierarchy that never grew. Three extra parameters for a feature you were sure someone would request. Abstractions built for a future that never arrived, cluttering the code with unused generality.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Status Variable</title><link>https://codesmells.org/smells/status-variable/</link><guid isPermaLink="true">https://codesmells.org/smells/status-variable/</guid><description>found = False. Then a loop. Then found = True somewhere inside. Then a check after. Mutable flags that complicate control flow when a direct return or a built-in would express the same logic in a single line.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Temporary Field</title><link>https://codesmells.org/smells/temporary-field/</link><guid isPermaLink="true">https://codesmells.org/smells/temporary-field/</guid><description>A field that&apos;s null eleven months of the year and suddenly matters during one specific calculation. The object carries it everywhere, for one brief moment of relevance.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Tramp Data</title><link>https://codesmells.org/smells/tramp-data/</link><guid isPermaLink="true">https://codesmells.org/smells/tramp-data/</guid><description>Data hitchhiking through a chain of methods that never use it. Each function accepts the parameter, ignores it, and passes it along — just so the one at the end of the line can finally read it.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Type Embedded in Name</title><link>https://codesmells.org/smells/type-embedded-in-name/</link><guid isPermaLink="true">https://codesmells.org/smells/type-embedded-in-name/</guid><description>playerName, dateString, userList: the type is already in the annotation, and now it&apos;s in the name too. Redundant today, misleading tomorrow when the type changes but the name doesn&apos;t.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Uncommunicative Name</title><link>https://codesmells.org/smells/uncommunicative-name/</link><guid isPermaLink="true">https://codesmells.org/smells/uncommunicative-name/</guid><description>data, val, m1, temp, get_f(). The code compiles fine. Understanding it requires reverse-engineering every abbreviation the original author thought was self-evident.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>Vertical Separation</title><link>https://codesmells.org/smells/vertical-separation/</link><guid isPermaLink="true">https://codesmells.org/smells/vertical-separation/</guid><description>Variables declared at the top of a method, used fifty lines later. By the time you reach the logic that needs them, you&apos;ve already forgotten what half the variables were for.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item><item><title>&quot;What&quot; Comment</title><link>https://codesmells.org/smells/what-comment/</link><guid isPermaLink="true">https://codesmells.org/smells/what-comment/</guid><description>Comments that narrate what the code does instead of why — a deodorant sprayed over smelly code, where extracting a well-named method would eliminate both the smell and the comment.</description><pubDate>Tue, 19 Apr 2022 00:00:00 GMT</pubDate></item></channel></rss>