Seeing that Uncle Bob is making a new version of Clean Code I decided to try and find this article about the original.

  • dandi8@fedia.io
    link
    fedilink
    arrow-up
    0
    ·
    3 months ago

    It’s only as incomprehensible as you make it.

    If there are 6 subfunctions, that means there’s 6 levels of abstraction (assuming the method extraction was not done blindly), which further suggests that maybe they should actually be part of a different class (or classes). Why would you be interested in 6 levels of abstraction at once?

    But we’re arguing hypotheticals here. Of course you can make the method implementations a complete mess, the book cannot guarantee that the person applying the principles used their brain, as well.

    • FizzyOrange@programming.dev
      link
      fedilink
      arrow-up
      0
      ·
      3 months ago

      Why would you be interested in 6 levels of abstraction at once?

      Because there aren’t 6 interesting levels of abstraction. It’s like talking to a child:

      What are you doing?

      Finances

      What does that involve?

      Processing money.

      What kind of processing?

      Summarising

      What kind of summaries?

      Summaries of everything

      What specifically though?

      Summaries

      Ok so you’re just displaying total balance then…

    • BatmanAoD@programming.dev
      link
      fedilink
      arrow-up
      0
      ·
      3 months ago

      Because abstractions leak. Heck, abstractions are practically lies most of the time.

      What’s the most time-consuming thing in programming? Writing new features? No, that’s easy. It’s figuring out where a bug is in existing code.

      How do abstractions help with that? Can you tell, from the symptoms, which “level of abstraction” contains the bug? Or do you need to read through all six (or however many) “levels”, across multiple modules and functions, to find the error? Far more commonly, it’s the latter.

      And, arguably worse, program misbehavior is often due to unexpected interactions between components that appear to work in isolation. This means that there isn’t a single “level of abstraction” at which the bug manifests, and also that no amount of unit testing would have prevented the bug.

      • dandi8@fedia.io
        link
        fedilink
        arrow-up
        0
        ·
        3 months ago

        How do abstractions help with that? Can you tell, from the symptoms, which “level of abstraction” contains the bug? Or do you need to read through all six (or however many) “levels”, across multiple modules and functions, to find the error?

        I usually start from the lowest abstraction, where the stack trace points me and don’t need to look at the rest, because my code is written well.

          • dandi8@fedia.io
            link
            fedilink
            arrow-up
            0
            ·
            3 months ago

            I do, and whether I have a good time depends on whether they have written their code well, of which the book’s suggestions are only one metric.

    • FlorianSimon@sh.itjust.works
      link
      fedilink
      arrow-up
      0
      ·
      3 months ago

      Six levels of abstractions, sure, if you have that many, you may want 6 functions. But that contradicts Martin when he’s saying that there should be one line in an if, and everything more should be promoted to its own function. There’s no way a programmer routinely writes code so terse that you get six levels of abstraction in a dozen of lines of code. Otherwise, Martin doesn’t understand what an abstraction is.

      Managing a stack in your head like a computer is very challenging as far as cognitive load is concerned. You don’t want to jump all over the place. Otherwise, when you reach your destination, you end up forgetting what got you here in the first place.

      This form of code fragmentation makes debugging an absolute nightmare, and finding sources of mutation absurdly frustrating. Good tooling can help you track where a variable is used and in which order mutations happen trivially in code in a single function. It’s not as as helpful when it’s spread all over the place. You can infer so much less statically if you follow Martin’s advice.

      I’m not advocating for 1000-lines functions here, mind you. When functions become too big, other challenges arise. What’s necessary is balance, which Martin’s book fails to teach.