5 Tips To Achieve Low Coupling In Your Python Code

แชร์
ฝัง
  • เผยแพร่เมื่อ 28 พ.ย. 2024

ความคิดเห็น • 131

  • @ArjanCodes
    @ArjanCodes  ปีที่แล้ว

    👷 Join the FREE Code Diagnosis Workshop to help you review code more effectively using my 3-Factor Diagnosis Framework: www.arjancodes.com/diagnosis.

  • @alexliu1779
    @alexliu1779 9 หลายเดือนก่อน +3

    Intermediate structures are the key idea of building data applications, analysis. Using data standards as an interface so that you can split the pipeline into decoupled parts. Create smaller data structures as objects when necessary to lessen the burden of larger classes. Thanks Arjan!❤

  • @POINTS2
    @POINTS2 2 ปีที่แล้ว +29

    6:48 Using a helper function to create objects works great! Ever since I watched your other videos on decoupling, I was at a loss for a simple way to create objects that were previously in the class initializer.
    10:58 Showing how a Protocol class is useful here especially with third-party libraries is really helpful. Again, after watching your previous videos on decoupling, I wasn't sure how to setup my class to work with both an ABC and the third-party library. Using a Protocol class will solve this.
    Thanks for the great video!

  • @jasonx7803
    @jasonx7803 2 ปีที่แล้ว +39

    We used intermediate structures a lot in the enterprise search I worked on. We had individual parsers for different file types like PDF or Word or HTML, etc, that all converted to our internal XML that kept the relevant information we needed like sentence and paragraph structure, but didn’t care about any other formatting. So the actual search indexer didn’t need to know anything about the original document formatting. We supported cross language search, as well, so we had intermediate objects to represent the “idea” that the user searched for, which we could retrieve in any language, not just the one they used. (Mostly useful for multilingual support orgs where documentation is not always in sync across languages.)

    • @zubirhusein
      @zubirhusein 2 ปีที่แล้ว +2

      Yup, this concept is something I teach to junior programmers since I've definitely painted myself into a corner when I wasn't aware of this

    • @arentstienstra8614
      @arentstienstra8614 2 ปีที่แล้ว +2

      Interesting! I guess that using a formal like XML or JSON is preferred over a python object because it's language agnostic? I usually use dataclasses as an intermediate @datastructure and I wonder what the downsides are.

  • @TheCalcaholic
    @TheCalcaholic 2 ปีที่แล้ว +20

    What really taught me to avoid strong coupling in my code is when I started working with rust.
    The variable ownership concept of rust makes heavily coupled data structures (as I was used to to from working with strongly object oriented languages) very painful.
    I really learned to think about software architecture differently from that :)

    • @aoeu256
      @aoeu256 ปีที่แล้ว +1

      One thing he doesn't talk about is using concrete static types: they introduce coupling... You can avoid it by not declaring static types (if your a lone developer) or doing message: Message where Message is an alias of str instead of message: str.

  • @sjmarel
    @sjmarel 2 ปีที่แล้ว +7

    Nice! I recently applied many techniques you have described in your videos to several projects at work. Protocol produced lots of awesomeness. We had this problem were we have several database sources that didn't share a common engine, and also different database destinations. Using protocols we just described the interface for the extraction class and the loader class and then, each time we had to add a new source or destination, we just added a new class from that protocol. A configuration file described which subclass to use. The course is so clean and concise now... Thank you again!

  • @zubirhusein
    @zubirhusein 2 ปีที่แล้ว +12

    Very good set of tips here. This is extremely useful for working with databases and schemas. It's way easier to test when you abstract the DB details away into a database adapter class and abstract schema. Need to change database? Now you only need to change the adapter instead of every piece of business code that interacts with the data.

  • @robertbrummayer4908
    @robertbrummayer4908 2 ปีที่แล้ว +12

    Great video, Arjan. I agree, low coupling is generell a good thing to aim for. Moreover, when combined with high cohesion in each individual module, this is usually a sign of excellent code quality.

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว +1

      Thanks so much Robert.

  • @Smartskaft2
    @Smartskaft2 ปีที่แล้ว

    I love this stuff. I use it all the time, for as many third party libraries or utilities as I can. Configuration parameters, inputs and outputs, visualization data. A simple data structure goes a long way of making life so much easier when your dependencies change. And keep you sane while unit testing your code, since you can avoid any mocking or stubbing procedures over-engineered by the library developers.

  • @MichelAlbert
    @MichelAlbert 2 ปีที่แล้ว +3

    The "Inappropriate Intimacy" reminds me about a "code-smell" I look out for during reviews: Overuse of list-indices. I've come to realise that the more time I invested into code-maintainability, decoupling, separation of concerns and dependency injection/inversion the number of times I need to use list-indices has plummeted. They are still necessary at times. But more often than not, there are better/more appropriate datatypes than list or tuples. If I spot excessive index-usage I do tend to take a closer look to see if nothing can be done about it.

  • @bkyuch
    @bkyuch 2 ปีที่แล้ว +1

    I'm really amused by how good your content is. I've worked only 2 years as a software dev and can learn so much from your explanations. Thank you, Arjan! :)

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว +1

      Thanks so much Bogdan, glad the content is helpful!

  • @TheBlazeThrower
    @TheBlazeThrower 2 ปีที่แล้ว +1

    I was looking for this exact video in your channel over the last few days for a project where I’m struggling with coupling. Amazing timing! This helps so much

  • @Yotanido
    @Yotanido 2 ปีที่แล้ว +13

    One thing I have learnt the hard way, though, is that you sometimes have to be careful not to reduce coupling too much. Strong coupling is bad, but splitting your code into a million tiny pieces that barely interact with each other is also terrible.
    I've now switched to writing coupled code first, and refactoring it once it becomes a problem. I suppose it is kind of like avoiding premature optimisation, if you abstract too much too fast, you might accidentally end up with Java.
    Then again, especially some of the earlier (negative) examples in this video were... well. Gotta be honest, I wouldn't even have considered those approaches.

    • @aoeu256
      @aoeu256 ปีที่แล้ว

      Note that Java has to abstract because it is statically type, it seems a lot of the time Python can do some Python dynamic thing with decorators or something else even when you practice YAGNI(your not gonna need it) since it is already has lots of levels of indirection/late binding. Also how come no one speaks about how giving concrete types to things causes code coupling, one way to reduce it is to either not declare types (single developer), or to alias types so that you can change them later.

  • @kwanyise7807
    @kwanyise7807 ปีที่แล้ว +1

    wow, terrific video.
    I have been watching your videos for for some past few months now and and you are really good at what your doing. if you could help us create a series of videos on a any of your side project showing us how you will apply all what you have been doing in your videos (from design, code refactoring etc), like combining everything in a single project. Thanks Sir @Arjan.

  • @astronemir
    @astronemir 2 ปีที่แล้ว +2

    This is the perfect follow up to your ABC/Protocol and Uncle Bob's videos. Thanks so much for sharing. Your videos have helped me immensely. I now maintain several code bases that thanks to separation of concerns, are well tested And easily extensible. The last part is super important for the astrophysics research I do. Previously, I would write a new set of scripts, (20-100) for each research project just because they are all so different., and my attempts at creating libraries were never quite successful. But I realized that it was the degree of coupling which made it really hard to extend and re-use my codes. I am both more productive and a much better coder.

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว +1

      Thanks so much Emir, glad the content is helpful!

  • @djl3009
    @djl3009 2 ปีที่แล้ว +4

    I really like these kinds of videos, which are brief reminders of what your channel is really about. As a personal observation, intermediate data structures can be a challenge to design effectively in non-trivial cases. The sheer effort required to perform the raw analysis of a non-trivial problem domain and subsequent design of the data structure(s) to adequately cover the solution domain is only part of the challenge, the larger part of the challenge tends to be posed by the management style of the "average project manager" -- this translates into time pressure to "get things done". Then again, this could be said of any of the best practices that you cover on this channel.

  • @EldorJ10
    @EldorJ10 ปีที่แล้ว +2

    This is a really great tips not just in python but almost all programming languages. Great stuff here Arjan!

  • @gleep83
    @gleep83 ปีที่แล้ว

    You have no idea how long I've been looking for this kind of content. Thank you so much.

  • @m__42
    @m__42 ปีที่แล้ว

    Fully agree on the intermediate data structures.
    Apart from separating own code, it also provides an important abstraction layer when having code that accesses external services. There, if you introduce intermediate data structures which you then return via a Facade, you ONLY couple the facade to the external system or library - not your entire project. If the external System ever changes - or you decide to swap it out for something else - you only have to adapt the Facade, not bits and pieces spread around everywhere.

  • @JorgeLuis-ts6qp
    @JorgeLuis-ts6qp 2 ปีที่แล้ว

    Answering 5:10 in a big company: people that have not written code in years want to see high percentages of test coverage. So even though the function is silly, some developers have to write a test that executes that function.

  • @Andreas-gh6is
    @Andreas-gh6is 9 หลายเดือนก่อน

    More tips: 1. no side effects on the module level 2. keep files small 3. keep imports between your modules minimal 4. use contextvars/contextmanagers for dependency injection 5. avoid inheritance 6. avoid, at all cost, multiple inheritance 7. especially in tests, consider putting import statements into functions, not at the module level 8. use existing abstractions and protocols as much as possible (iterators, sequences, callable, etc)

  • @TacticalTruth
    @TacticalTruth 2 ปีที่แล้ว

    It is nice to see content with mid to advanced topics.

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thank you Ammar, glad you liked the video!

  • @ArpadHorvathSzfvar
    @ArpadHorvathSzfvar 2 ปีที่แล้ว

    To test project creation from Excel, I've introduced a excel dictionary data structure that was close to the original Excel but just a dictionary with column titles, a distilled version of a pandas DataFrame. To create the project I need to do a lot of transformations (e.g. Yes -> True, deleting some empty fields, adding ids, using unified field names, "10 mins" -> 600). So I was able to separate the IO step from the conversion, and to test the conversion without using BytesIO objects, just using that dictionary representation.

  • @jorisjansen2892
    @jorisjansen2892 2 ปีที่แล้ว +7

    Hi Arjen, great video again! A question about Tip1, aren’t you worried about introducing too much functions, floating around in you codebase that are ‘related’ to some objects in any way? I see this also applies to Tip 2.
    Not sure if introducing a lot of functions is more readable over classes with methods🧐

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว +7

      Hi Joris, thank you! And no, I'm not really worried :).
      There are several ways to organize your code: in folders, files/modules, classes. I never noticed that I had a problem of having too many functions floating around or that I felt the need to introduce deeper inheritance hierarchies to be able to structure the code better.
      I'm not against using classes with methods by the way, my point with the first tip is to be careful with deep inheritance hierarchies.

  • @ankursrvstva
    @ankursrvstva 2 ปีที่แล้ว

    This is amazing and so well explained with examples. The protocol way is much cleaner and makes more sense after watching this video.
    Thank you so much!

  • @mrswats
    @mrswats 2 ปีที่แล้ว +3

    Inappropriate intimacy is such a funny name

  • @salvaje1
    @salvaje1 2 ปีที่แล้ว +4

    Thank you for the videos, they always make me want to look at my code for a few more seconds and ask if there is a better way of doing it. I have been able to identify code smells more easily in my own work and in others.
    I have a request: Could you do a deep dive into code testing? I have a hard time understanding how you would write a test for code you have not written yet, and also how you would be able to come up with automated tests for every scenario. You mentioned something about using protocol classes to create mock objects and I would like to see that. Most of my testing right now is done by creating test objects and running the specific part of the project and checking to see if the output looks right. As time goes on, I might decide on a different approach to a problem or the requirements can change in between, how are pre-written tests going to work here? Also, if I was to create tests for something that requires a database, how would automated tests handle that in a CI/CD pipeline with external tools like github actions?

    • @DerekHohls
      @DerekHohls 2 ปีที่แล้ว

      Two thumbs up for more on "protocol classes to create mock objects" - this sounds really interesting!

  • @alejandrocarmena8767
    @alejandrocarmena8767 2 ปีที่แล้ว +1

    Hi Arjan! I found the last tip particularly useful! Another example of intermediate data structure would be OS drivers?

  • @helloworld9018
    @helloworld9018 2 ปีที่แล้ว

    Just when I needed it most! I've made services layer in my project and I was thinking about how to achieve low coupling between apps.

  • @kayakMike1000
    @kayakMike1000 2 ปีที่แล้ว

    You could .... Draw your graph on the thumbnail with an automatic tool like graphiz. There's also networkx to help with a transitive reduction on your graph.
    An automated process to keep a large project under control is a good idea.

  • @e1nste1in
    @e1nste1in 2 ปีที่แล้ว

    Really nice overview, thanks!

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks so much, glad the content is helpful!

  • @mateuszsmendowski2677
    @mateuszsmendowski2677 2 ปีที่แล้ว

    Again, great summarizarion of best practices 🎉

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว +1

      Thanks so much Mateusz, glad the content is helpful!

  • @Pirake123
    @Pirake123 2 ปีที่แล้ว

    Fantastic video @Arjan, I love these best practice practical guide videos.

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks so much Concon, glad the content is helpful!

  • @pawanchaturvedi8973
    @pawanchaturvedi8973 2 ปีที่แล้ว

    Thanks a lot for your video. It helps people like me understand a lot of things which I may clarify further for my juniors.

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks so much Pawan, glad the content is helpful!

  • @janpeterbennett9122
    @janpeterbennett9122 ปีที่แล้ว

    Sweet, simple.

  • @carlwestman9343
    @carlwestman9343 2 ปีที่แล้ว

    Suuupernice vid! I love these vids where you can take points and apply in other coding languages to :)

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks so much Carl, glad the content is helpful!

  • @davidspez7267
    @davidspez7267 2 ปีที่แล้ว

    Thank you Arjan😊

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      You're welcome David, glad you liked the video!

  • @thisoldproperty
    @thisoldproperty 2 ปีที่แล้ว

    Another great video of good, solid coding reminders. Thanks for the effort you go to in creating these!

    • @thisoldproperty
      @thisoldproperty 2 ปีที่แล้ว

      I’m always interested in your grouping of functions, classes (or methods) and folder structures.

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks so much Andrew, glad the content is helpful!

  • @ThijmenCodes
    @ThijmenCodes 2 ปีที่แล้ว

    Well-picked examples. Thanks!

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว +1

      Thanks so much Thijmen, glad you liked it!

  • @giovanniosorio4759
    @giovanniosorio4759 2 ปีที่แล้ว

    I’m not familiar with intermediate data structures. Could you please make a video about it? I’ve learned a lot from you! Thank you

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks for the suggestions, Giovanni, I've put it on the list.

  • @hansdietrich1496
    @hansdietrich1496 ปีที่แล้ว

    On 10:55 well it is possible with abstract base classes. ABCs have a function called register and you just need to go ahead and register any third party or whatever class, as being an impementation of this ABC. Maybe not as elegant as the protocol, but possible.

  • @bunnyboy7008
    @bunnyboy7008 2 หลายเดือนก่อน

    Are there resources which further explore the concept of "Intermediary Data Structures"? I wish to learn more about them in a detailed manner with some practical examples. Having done a quick TH-cam search, there doesn't appear to be any resource for it

  • @ashutoshupadhyay420
    @ashutoshupadhyay420 ปีที่แล้ว

    Could we use the abstraction tip in the example you gave for Elastic Search and create a Protocol class for the same? Why did you move that code to methods?

  • @zamoat
    @zamoat 11 หลายเดือนก่อน

    For #4, the signature of the generate_breadcrumbs could be further changed to accept postal_code, city, province to further avoid the intimacies

  • @stephenpaek9175
    @stephenpaek9175 10 หลายเดือนก่อน

    Thank you for the great insights

    • @ArjanCodes
      @ArjanCodes  10 หลายเดือนก่อน

      Glad it was useful for you, Stephen!

  • @JusticeNDOU
    @JusticeNDOU 2 ปีที่แล้ว +1

    arjan is back

  • @julienblanchon6082
    @julienblanchon6082 2 ปีที่แล้ว +1

    I'm curious where did you do your intership at the time (25 year ago) ?

  • @_noirja
    @_noirja ปีที่แล้ว

    So I get that the EmailServer Protocol removed the explicit dependency on SMTP but doesn't it implicitly still rely on it given that the protocol has to mirror the methods in that class? What if you wanted to add an alternative to SMTP but it had different properties/methods or even just different names?

  • @kayakMike1000
    @kayakMike1000 2 ปีที่แล้ว

    Adapter class FTW, version you need something that provides a specific Foo. Then you realize you can scrape Foo from a database, then you're reading in a Foo data from an XML dump, and then it makes sense to cache some of the Foo's stuff in a NoSQL database... All of these Foo's pretty much have the same behavior, but load from really different places.

  • @RedShipsofSpainAgain
    @RedShipsofSpainAgain 2 ปีที่แล้ว

    7:51 When you pass that Message object into the send_message() function, is that an example of "dependency injection"? Since you're injecting the entire Message object into the send_message() function as an argument?

  • @againstthegrain5914
    @againstthegrain5914 2 ปีที่แล้ว +1

    Where did you learn about all this?

  • @AlexanderWhillas
    @AlexanderWhillas 2 ปีที่แล้ว

    Hey, is there a link to the research paper he was talking about in the intermediate structures section?

  • @appuser
    @appuser 2 ปีที่แล้ว

    I'm not utilizing structural typing!! It finally clicked why I might like using Protocol instead of ABC.

    • @JusticeNDOU
      @JusticeNDOU 2 ปีที่แล้ว

      i used protocol once then ABC several times, i still can not really understand the difference , i guess i am saying i wish it will click for me too,

    • @appuser
      @appuser 2 ปีที่แล้ว +1

      Well, theyre pretty similar. But I think a protocol is just any object that has certain methods/members, whereas your class must actually inheret from the base abstract class to be considered a valid type. Hence you'd have to use multi-inheritance or some other fuckery to use it for static type/member checks where you want to have methods from a library or whatever enforced with the type check. Need to write some little mucking.py scripts to confirm.

  • @DS-tj2tu
    @DS-tj2tu 2 ปีที่แล้ว

    Thank you!

  • @Klej0aka0Klej
    @Klej0aka0Klej 2 ปีที่แล้ว

    Great freaking video!

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks so much. :)

  • @rdean150
    @rdean150 2 ปีที่แล้ว

    I've been using more Protocols lately but one minor detail I'm unsure about. I prefer to keep my protocols in a dedicated "protocols.py" module within my package, so that all of the various modules in my package can just import that rather than having circular imports or unnecessary cross-dependencies just to type-annotate parameters. Is this approach of defining protocols separately from the classes that implement them or use them considered good practice?

  • @PaulSebastianM
    @PaulSebastianM 2 ปีที่แล้ว +1

    Want less coupling? Ditch OOP and go Functional. J/K
    Use SOLID.

  • @pritamghosh270
    @pritamghosh270 2 ปีที่แล้ว

    Sir, could you please help me to figure out that if I pass "msg" as an argument in send_message (method) So, where I should initialize it's class and then pass the object coz atleast somewhere I must initialize it. correct me please . Thank you

  • @MicheleHjorleifsson
    @MicheleHjorleifsson 2 ปีที่แล้ว

    Is that car crash project you worked on available ? Would love to show some folks interested in python in that type of capability to get them excited.

  • @vigneshmurali1994
    @vigneshmurali1994 2 ปีที่แล้ว

    How are you switching between normal cursor and the Block Cursor? Is that Insert mode?

  • @johanlarsson9805
    @johanlarsson9805 2 ปีที่แล้ว +1

    11:00 So you are saying that such simple programming practices are not even standard?
    Using interfaces/protocols/etc is well worth the effort since it makes other things so much simpler.
    Along with what you are saying here and the corporate code I've been reading I'm starting to feel like an A+ developer even though I know I am shit.

  • @nateriver8261
    @nateriver8261 2 ปีที่แล้ว

    Great video!

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks so much Nate, glad the content is helpful!

  • @cod-newbie9166
    @cod-newbie9166 2 ปีที่แล้ว

    Protocol classes are like interfaces right?

  • @yash1152
    @yash1152 ปีที่แล้ว

    1:44 i really was expecting u'd explain it in ur words...

  • @alexandterfst6532
    @alexandterfst6532 2 ปีที่แล้ว +1

    i dont understand why tip2 reduce coupling.
    but Great video, thank you!

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว +3

      If you separate creation from use, then you can decouple the code that uses the resource from anything that’s needed to create it. And then you pave the way for introducing abstraction as well, which is the next tip 😊.

    • @zubirhusein
      @zubirhusein 2 ปีที่แล้ว +1

      Once you separate creation from use, you give yourself more freedom to change how the object is created. Hugely beneficial for automated testing

  • @xWolf141x
    @xWolf141x 2 ปีที่แล้ว

    Hi Arjan!
    One question about abstracting low level modules. If you abstracted database A module with a protocol/ABC that has to have a connect() method, how would you deal with replacing module A with module B if the methods are not named the same, but for example db_connect() ? Do they have to have same method names? Wouldn't that also then be a dependency in itself?

    • @thisoldproperty
      @thisoldproperty 2 ปีที่แล้ว +1

      Suggest you watch Arjan’s video on the light switch/fan abstract example. I think that will clearly answer your question here.

    • @rdean150
      @rdean150 2 ปีที่แล้ว +2

      You could use an adapter class that takes an instance of Database B and provides the correct interface to satisfy the Protocol / ABC by calling the appropriate methods on it, and then use a factory to choose and return the correct adapter instance.

  • @sarthaksharma7292
    @sarthaksharma7292 2 ปีที่แล้ว

    I've noticed the more coupling I try to avoid, the more code I end up writing. As I have to write independent interfaces to completely isolate one module from another. Any for dependencies, I try to use buffer so each module can run asynchronously. But that ends up into more code. And this has served me well for years. But whenever I take a deep-breath and take a look at the code. It feels bloated. :/

  • @uwuwgrhdhwj
    @uwuwgrhdhwj 2 ปีที่แล้ว +1

    Hey Arjan, your videos are really good. Wanted to point out one thing in the Protocol subclasses. Instead of using an ellipse "..." You can just write a docstring """my code comment""". It's more helpful and it is also valid sintax (since the ellipse doesn't do anything).

    • @rdean150
      @rdean150 2 ปีที่แล้ว

      Do you happen to know if Sphinx recognizes and uses docstrings on the Protocol to generate docs if the implementation classes don't have docstrings?

    • @uwuwgrhdhwj
      @uwuwgrhdhwj 2 ปีที่แล้ว

      @@rdean150 as far as I know you need to leave the docstrings yourself. However you don't need to specify the return. Since even if it's the same type it can follow another condition in the subclasses

  • @simajacob7416
    @simajacob7416 2 ปีที่แล้ว

    Can you please do a video on the inversion of the control container in python?
    Something similar to Autofac in C#

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thanks for the suggestions, Sima, I've put it on the list.

  • @PetrSUsername
    @PetrSUsername 2 ปีที่แล้ว

    Good video.

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Thank you Petr, glad you liked the video!

  • @user-wr4yl7tx3w
    @user-wr4yl7tx3w 2 ปีที่แล้ว +1

    Can coupling issue be avoided by using functional programming?

    • @ra2enjoyer708
      @ra2enjoyer708 2 ปีที่แล้ว

      Not really, passing a struct as a first argument to a function isn't functionally different from calling a method on a class instance (in fact in python they would have the same signature). It does avoid a lot of headaches related to OOP but by itself doesn't remove the problem of a potentially mutable context object being a dumping ground for values. Another issue of pure functional approach at least in python is annotating functional types is a complete ass.

  • @MMarcuzzo
    @MMarcuzzo 2 ปีที่แล้ว

    2nd is command-query separation from Martin Fowler, I guess

  • @SageBetko
    @SageBetko 2 ปีที่แล้ว

    Hi Arjan, you have a typo ("Enrol Now") on your code diagnosis sign up page, FYI.

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว +1

      Actually, the non US spelling is with a single L. But I've changed it now to use the US spelling since I also use that on the rest of my website.

  • @soylentpink7845
    @soylentpink7845 2 ปีที่แล้ว +2

    „The first big coupling problem that I had to solve myself…“ - so awaited for you talking about your first wife and your marital problems… Next Time!

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Haha, that's a topic for another video :).

  • @coderider3022
    @coderider3022 2 ปีที่แล้ว

    I do my c# and python in a solid way and I was told not to be an uncle bob.

  • @DerekHohls
    @DerekHohls 2 ปีที่แล้ว

    th-cam.com/video/qR4-PBLUZNw/w-d-xo.html Where is the "Message" object defined, that is returned for the 'create_mime_multipart' function?

  • @spaceyfounder5040
    @spaceyfounder5040 2 ปีที่แล้ว

    Could you put the link to your paper showed in the last section?

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      Here it is: ris.utwente.nl/ws/portalfiles/portal/28160157/00000051.pdf. It's really old though, so I'm not sure it's still of any use :).

  • @Rene-tu3fc
    @Rene-tu3fc 2 ปีที่แล้ว

    so now I figured why programmers are lonely. they avoid coupling

  • @pranavnyavanandi9710
    @pranavnyavanandi9710 2 ปีที่แล้ว

    I am too noob to understand all that code

  • @ViraLok
    @ViraLok ปีที่แล้ว

    Donc tu parles français ?

  • @againstthegrain5914
    @againstthegrain5914 2 ปีที่แล้ว

    Link is dead lol

    • @ArjanCodes
      @ArjanCodes  2 ปีที่แล้ว

      The link seems to work fine here?

    • @thisoldproperty
      @thisoldproperty 2 ปีที่แล้ว

      I worked for me, too

  • @unoxunox4086
    @unoxunox4086 2 ปีที่แล้ว

    why are the exaples so complex? I can follow until Elasticsearch and following tools i cannot remember. I have to leave your Video.
    so i am out, and not able to understand the content. 😭
    I would like to have more examples on 'hello world' basis, to follow the content.
    maybe i'm not experienced enough for your content.
    If you could have a look into your analytics that many guys are breaking up at example time, i'm not the only one.

    • @xWolf141x
      @xWolf141x 2 ปีที่แล้ว +3

      There are many other channels that can teach you the basics. Arjan's goal is not teaching you the basics, but the more advanced principles.

    • @jesse9999999
      @jesse9999999 2 ปีที่แล้ว +3

      In the case of programming, I think it's more helpful to see how someone uses something practically rather than just the absolute techincal fundamentals of whatever's being discussed. Arjan's videos are generally like the former, but there are so many other channels you can watch that do the latter.

  • @iamworstgamer
    @iamworstgamer 2 ปีที่แล้ว

    you are a good engineer but your courses are so fucking expensive. Please do a market research

    • @coderider3022
      @coderider3022 2 ปีที่แล้ว

      He is very good at explaining things , good mix of theory and examples. The content is standard knowledge for object oriented devs so you can get that elsewhere if you look beyond python or study well known git hub projects. You need to decide if it’s worth the investment but your only as good as the information you take in or teams you work in.