• Serinus@lemmy.world
    link
    fedilink
    arrow-up
    0
    ·
    1 month ago

    OOP is great, and can be much simpler than what you’ve seen.

    It’s Java culture that’s terrible. The word “Factory” is a code smell all on its own.

    Just like any tool, don’t overuse it. Don’t force extra layers of abstraction.

    • GissaMittJobb@lemmy.ml
      link
      fedilink
      arrow-up
      0
      ·
      1 month ago

      I’ve realized that Factories are actually kind of fine, in particular when contexualized as being the equivalent of partials from the world of functionals.

      • Kache@lemm.ee
        link
        fedilink
        arrow-up
        0
        ·
        edit-2
        1 month ago

        IMO factory functions are totally fine – I hesitate to even give them a special name b/c functions that can return an object are not special.

        However I think good use cases for Factory classes (and long-lived stateful instances of) are scarce, often being better served using other constructs.

      • Serinus@lemmy.world
        link
        fedilink
        arrow-up
        0
        ·
        1 month ago

        I have never seen them used well. I expect there IS some use case out there where it makes sense but I haven’t seen it yet. So many times I’ve seen factories that can only return one type. So why did you use a factory? And a factory that returns more than one type is 50/50 to be scary.

        Yeah, I went through the whole shape examples thing in school. The OOP I was taught in school was bullshit.

        Make it simpler. Organizing things into classes is absolutely fine. Seven layers of abstraction is typically not fine.

        • GissaMittJobb@lemmy.ml
          link
          fedilink
          arrow-up
          0
          ·
          1 month ago

          Consider the following: You have a class A that has a few dependencies it needs. The dependencies B and C never change, but D will generally be different for each time the class needs to be used. You also happen to be using dependency injection in this case. You could either:

          • Inject the dependencies B and C for any call site where you need an instance of A and have a given D, or
          • Create an AFactory, which depends on B and C, having a method create with a parameter D returning A, and then inject that for all call sites where you have a given D.

          This is a stripped example, but one I personally have both seen and productively used frequently at work.

          In this case the AFactory could practically be renamed PartialA and be functionally the same thing.

          You could also imagine a factory that returns different implementations of a given interface based on either static (B and C in the previous example) or dynamic dependencies (D in the previous example).

          • Kache@lemm.ee
            link
            fedilink
            arrow-up
            0
            ·
            edit-2
            1 month ago

            Sounds easy to simplify:

            Use one of: constructor A(d), function a(d), or method d.a() to construct A’s.

            B and C never change, so I invoke YAGNI and hardcode them in this one and only place, abstracting them away entirely.

            No factories, no dependency injection frameworks.

            • GissaMittJobb@lemmy.ml
              link
              fedilink
              arrow-up
              0
              ·
              1 month ago

              Now B and C cannot be replaced for the purposes of testing the component in isolation, though. The hardcoded dependency just increased the testing complexity by a factor of B * C.

      • skulbuny@sh.itjust.works
        link
        fedilink
        English
        arrow-up
        0
        ·
        edit-2
        1 month ago

        I always call my little helper higher order functions (intended to be partially applied) factories :)