Тёмный

Dependency Inversion Principle Explained - SOLID Design Principles 

Web Dev Simplified
Подписаться 1,6 млн
Просмотров 160 тыс.
50% 1

Опубликовано:

 

19 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 171   
@GenericInternetter
@GenericInternetter 5 месяцев назад
Genius. This guy succeeds where other tutorials fail. As soon as he said "adapter or façade pattern" it all clicked.
@Erik-rj5xz
@Erik-rj5xz 4 года назад
Another great video as always! I wish I learned SOLID earlier, so much pain and suffering could have been avoided.
@skewty
@skewty 4 года назад
I have mentored Jr. Developers and wanted to share my experience. Teaching SOLID too early doesn't work because the coder doesn't have the painful memories that mentally reinforce / accurately quantify the value of SOLID. The same goes for recognizing code smells. A Jr Developer is often just pleased with producing a result that works because that's what yielded a good mark in school. (CS degree is a joke IMO. Its like teaching just enough chemistry to make bombs without any safety training)
@danielmcgrane8608
@danielmcgrane8608 3 года назад
@@skewty ++. Let juniors be juniors so they can become good seniors
@asliddinburiev5143
@asliddinburiev5143 2 года назад
​@@danielmcgrane8608I am happy to read your comments. If dependency inversion is not for juniors then I am leveling up. (:
@p19ky
@p19ky 3 года назад
I studied the SOLID principles using Java, but these series in JavaScript are fantastic! Great work!
@simondavis1303
@simondavis1303 3 года назад
this clicks so well since it sounds like it's related to the open/closed principle earlier in the series :)
@cristianouzumaki2455
@cristianouzumaki2455 3 года назад
I am addicted to this channel now. I was searching for something else but when I saw this clip in suggestion, I had to come here as another interesting topic was explained so easily yet again.
@gyros9162
@gyros9162 11 месяцев назад
That is crazy but solid understanding of OOP and SOLID nowadays is must to have even for junior job seekers! Thank you!
@kaal_bhairav_23
@kaal_bhairav_23 4 года назад
This video has helped me in my GSoC '20 project thanks a lot
@vadymchecherinda2858
@vadymchecherinda2858 4 года назад
Tnx, finally I understood all these SOLID principles.
@renegade5942
@renegade5942 3 года назад
you made me understand in 2 min what others failed in hours, thank you so much , that example was very very good
@thenatureofnurture6336
@thenatureofnurture6336 2 года назад
Sub earned. Honestly, I looked for an explanation for half an hour and they all just repeated each other. None of them could actually explain it in simple terms like you did.
@giorgiobarchiesi5003
@giorgiobarchiesi5003 Год назад
Thank you; this is a very good example of inheritance and polymorphism (under the hood)
@nabiisakhanov3522
@nabiisakhanov3522 4 года назад
I really wish you'd remake these SOLID series with typescript
@colingarvey1079
@colingarvey1079 2 года назад
Does it really matter what language it is? Just gotta use your imagination to connect the dots and adapt it to your language of choice.
@thalibmuhammad9519
@thalibmuhammad9519 2 года назад
i think this is code language agnostic,
@zuzukouzina-original
@zuzukouzina-original Год назад
@@brianbitchballs3902 some guys need examples to understand.
@AhmedZin
@AhmedZin Год назад
@@zuzukouzina-original for concepts its better to learn UML which can help you disassociate your self from languages , and focus on understanding concrete ideas not examples
@lordpablo1985
@lordpablo1985 8 месяцев назад
TS is just JS with types...
@linwang9905
@linwang9905 2 года назад
Thanks for the very clear explanation! Depend upon abstraction sounds like a better name. Dependency inversion is a confusing name since store still depends on payment processor not payment processor depends on store.
@HandledToaster2
@HandledToaster2 2 года назад
Yeah the name is pretty bad, it implies Stripe/PayPal depends on store which doesn't make sense. The concept itself is brilliant though.
@adamadma310
@adamadma310 3 года назад
At first i didn't realy understand how the lower level modules change affect the main code, but when you showed the difference in arguments of Stripe and Paypal it just clicked for me. Great video, thanks!
@tuckercoffin2164
@tuckercoffin2164 4 года назад
Has anyone told you that you're awesome? No? Yes? Who cares. Here it is again. You. Are. Awesome. Thanks so much for these videos. You're also making me wanna learn more and more JavaScript.
@WebDevSimplified
@WebDevSimplified 4 года назад
Thank you so much!
@willl0014
@willl0014 2 года назад
I am speechless on how well you explained this. Props to you
@miguelangelgeq9080
@miguelangelgeq9080 2 года назад
Great video! I would like to see the SOLID principles using typescript. Thank you a lot!
@nikhilgoyal007
@nikhilgoyal007 2 месяца назад
thanks! Note to self - pass individual implementations as object in the intermediate class (functionality resides within individual implementations and intermediary acts as a glue). this way code is losely coupled and is easy to switch rather than be tightly coupled. Facade pattern eg. is very similar to this. Also Dependency injection in angular / Nest feels similar to this where controller will offload functionality to services).
@pprathameshmore
@pprathameshmore 4 года назад
Why there is a single dislike? He is such good teacher.
@nake89
@nake89 2 года назад
Some people might legit not like this video. But also a lot of bots dislike videos to appear like real users. When you "buy likes" from an underground service they will spam likes to the video you want, but to appear like they are not bots they will also dislike random videos (to make it seem like it is just organic traffic).
@satyenkasturi
@satyenkasturi 3 года назад
Thanks. I was struggling to digest the Dependency Injection and you clarified it very well. Great explanation.
@sukycar1
@sukycar1 3 года назад
This is dependency inversion principle
@sukycar1
@sukycar1 3 года назад
This is dependency inversion principle
@thereversejosh
@thereversejosh 3 года назад
Thanks for this explanation! I was watching another tutorial but got really lost on the explanation. Thanks a lot for this simplified explanation!
@bmehder
@bmehder 3 года назад
I loved this series. I hope you make more of the code concept videos in the future.
@miskyhusky
@miskyhusky 3 года назад
Crystal clear explanation! I wish I knew this channel earlier to save tons of time wasted on uni lecture slides!
@johongirrahimov2343
@johongirrahimov2343 3 года назад
Thanx men for making such a difficult concept so obvious
@cakradanusedayu910
@cakradanusedayu910 2 года назад
wow, the best explanation with real case scenario.. thank you very much..
@warrayn10
@warrayn10 11 месяцев назад
Thank you so much! You made it very simple to understand!
@avanishkumar1689
@avanishkumar1689 10 месяцев назад
every video is well explained tysm
@taylorfullstack
@taylorfullstack Год назад
Please never quit Kyle @webdevsimplified
@squdge
@squdge 2 года назад
Wouldn't you want just a single PaymentProcessor and have the logic for handling the different integrations within the class itself so you don't have to duplicate the entire class to change a method?
@KriegsterZ
@KriegsterZ Год назад
That violates OCP
@jonispatented
@jonispatented Год назад
No, you want some interface or set of interfaces for the payment processing, like an abstract class for the Payment Processor, and possibly using something like the Strategy Pattern, to make your concrete Payment Processors. Then you can use the Strategy Pattern to just swap out between different PaymentProcessors easily.
@aymanaboelazm3295
@aymanaboelazm3295 3 года назад
Dude, you are really doing a great job out there! Keep going :)
@boolcode
@boolcode Год назад
Very clear and understandable Thanks
@mahmoudzakria6946
@mahmoudzakria6946 5 месяцев назад
Really nice one! it reminds me of the BFF pattern.
@thienquangphan7195
@thienquangphan7195 Год назад
This is interesting explanation.
@mykevdc
@mykevdc Год назад
Thanks so much for this, really well explained!
@k1z1eMe01
@k1z1eMe01 3 года назад
Great tutorial, well delivered. Thank you!
@rafaelortiz6574
@rafaelortiz6574 4 года назад
what a great explanation and example, subscribed!
@victorportable3892
@victorportable3892 2 года назад
Now this video is old but i dont get one part: Shouldnt there be a Abstract Class or Interface that gets implemented/extended by both processors, so that you dont have to keep changing the payment method in the store? I mean at the moment you still can not allow both methods at the same time and you still have to make changes in your highlevel class for a lower-level change, wich kinda still violates DIP...
@mahditalebi1770
@mahditalebi1770 Год назад
Great video! Thanks for the explanation.
@adbhole
@adbhole 4 года назад
You should do a video on TDD or Unit testing (DI comes in handy)
@MrEnsiferum77
@MrEnsiferum77 3 года назад
This principle, is the most close to strategy pattern in my opinion...
@j3bb9z
@j3bb9z 4 года назад
DI without typing is a lot of pain. So, if you're writing any serious app in JavaScript, I *strongly* suggest using *TypeScript* .
@snowhite1qazse4
@snowhite1qazse4 2 года назад
While this is a DI.. This is also strategy pattern
@elierh442
@elierh442 3 года назад
Very well explained! You got a subscriber.
@nat4466
@nat4466 2 года назад
a goldmine of information... thank you a ton! just a note... would be great if you can provide a source code for the samples in the video, thanks again
@paldr_fighter
@paldr_fighter 4 года назад
Superbly explained, as always.
@samanthkumar1332
@samanthkumar1332 4 года назад
your video helps me to become a good full stack developer
@fayceltouili
@fayceltouili 3 года назад
Thank you for this great tutorial!
@franco-cespi
@franco-cespi 4 года назад
These are great videos. Thank you!
@matymad
@matymad 8 месяцев назад
Thanks!
@WebDevSimplified
@WebDevSimplified 8 месяцев назад
You are very welcome!
@anuragannu8930
@anuragannu8930 Год назад
great example
@benysetiawan8725
@benysetiawan8725 4 года назад
Hi Kyle, good tutorial. thank you. I am little bit confused to distinguish the OPEN/CLOSE and dependency injection based on your example. They are very similar. Can you explain more, please give example
@nandomax3
@nandomax3 4 года назад
SOLID is Single responsibility Open close principle Liskov substitution principle Interface Dependency injection Richard Martin's said that the S and the O can be join together and create a Dependency inversion principle. So in shorter words, they are the same
@vittoriomorellini1939
@vittoriomorellini1939 2 года назад
@@nandomax3 dependency injection is not a principle. Dependency inversion is the fifth principle. Dependency injection is an implementation
@nandomax3
@nandomax3 2 года назад
@@vittoriomorellini1939 it's funny, because I posted this a year ago and just learned about spring DI implementation this month hahahaha
@markangelogonzales2091
@markangelogonzales2091 2 года назад
Thank you, well explained
@muhammadumarsotvoldiev8768
@muhammadumarsotvoldiev8768 7 месяцев назад
Thank you very much
@misterjedu
@misterjedu 4 года назад
Only an interface is needed, which would be implemented by both Stripe and PayPal classes. I guess Javascript doesn't have interfaces, right?
@patakinorbert379
@patakinorbert379 3 года назад
normal js doesn't but typescript do, and its almost the same as js but you can use int, float, etc..
@anshuverma2475
@anshuverma2475 2 года назад
Youur videos are really great. Please provide the code for all the principles
@vinceramcesoliveros6739
@vinceramcesoliveros6739 4 года назад
For some who didn't know about the origin of DI. It was implemented as "Adapter Pattern" as one of Design Patterns. It was only coined as DI because we don't want to depend our application to the framework. We want the framework to depend our application.
@FG-qs8uj
@FG-qs8uj 4 года назад
I don't know what is to depend anymore. Or maybe it's that the word is ambiguous at times.
@vinceramcesoliveros6739
@vinceramcesoliveros6739 4 года назад
@@FG-qs8uj If you want to know more why DI is so important in large scale application. try to search up Clean Architecture by Uncle Bob. It's just the same as SOLID principle. If you're not happy with OOP. then youi can always go back to Functional Programming.
@FG-qs8uj
@FG-qs8uj 4 года назад
If you read what you wrote: We don't want to depend X to Y. We want Y to depend X. X is application, Y Is framework. Wouldn't be better: We don't want X to depend on Y. We want Y to depend on X? Or: We don't want Y as a dependency of X We want X as a dependency of Y. In any case, my point is that saying X depends on Y is more intuitive to me. I.e. an application depends on a framework to work, i.e. if you see the application requirements file you would see the framework mentioned. The other way, Y depends on X. Meaning the framework depending on the application is not intuitive to me, since the framework doesn't need the application to work. I suppose then that the semantics of 'depend' and derivative words is what is confusing. And even then, I don't see the point on discussing Y depending on X Vs X depending on Y. At the end I don't see what changes in the code.
@ChunkiFTW
@ChunkiFTW 2 года назад
Easy explained. Heads up
@Stefan-xm9qb
@Stefan-xm9qb 11 месяцев назад
Why not make StripePaymentProcessor and PaypalPaymentProcessor implement an Interface PaymentProcessor to enforce the structure of the makePayment method? Optionally it could also extend a PaymentProcessor abstract class if there is some shared method.
@sanjaymahto5825
@sanjaymahto5825 2 года назад
You are just awesome. Thanks again for a great video as always
@InvincibleMan99
@InvincibleMan99 4 года назад
Is this not the example of Open/Closed Principle ?
@zacdef8845
@zacdef8845 3 года назад
Honestly fantastic.
@fayu7752
@fayu7752 4 года назад
Honestly i didn't catch the point of doing that in this example. For me it looks like instead of 2 store classes for each payment method we have just created 3 classes (1 store and 2 payment processors). I thought it should be one payment processor class for both cases which will react different depends on arguments we passed either paypal or stripe. So, a little bit confused by this lesson.
@WebDevSimplified
@WebDevSimplified 4 года назад
The point of this code is so that we can decouple the API we use and the store from each other. Now our store only depends on the processor wrapper we created so we can freely change our API of choice by just creating a new wrapper to wrap that API and our store stays exactly the same. If we tried to make one payment processor that handled all the APIs then we would be violating other SOLID principles such as Open/Closed.
@fayu7752
@fayu7752 4 года назад
@@WebDevSimplified i didn't hear yet about that open/closed principles. Thank you for explanation and for all your short but effective lessons 👍
@SahilKashyap64
@SahilKashyap64 Год назад
Thank you
@xtremehackerzpro9511
@xtremehackerzpro9511 2 года назад
Awesome explanation, tnx :)
@mike111615
@mike111615 4 года назад
Crystal clear. Wow
@abdelrahmanmagdy3706
@abdelrahmanmagdy3706 Год назад
Thank you so much for this great tutorial. I think it would be better if you created an interface with function called pay and let the processors implement thisbfunction
@alejandroarmas7689
@alejandroarmas7689 Год назад
JavaScript doesn’t support interfaces unfortunately. That’s why I kinda wish he would’ve made these videos in typescript
@ES11777
@ES11777 Год назад
Thanks, bro
@zuzukouzina-original
@zuzukouzina-original Год назад
In Java, StripeProcessor and PaypalProcessor implement PaymentInterface.
@Co2GamerZ
@Co2GamerZ 3 года назад
Imagine then that PayPal introduces coupons as a payment functionality that we can now use. Would we then put the extra functionality in the PayPalPaymentProcessor and let the PaymentProcessor API stay as is, or would we have to redefine the API(s)? I myself tend to like the idea of putting the incommon functionality in the implementations themselves and keep the common API for common functionality, but I am not sure whether or not that follows SOLID well enough.
@irfangumelar5404
@irfangumelar5404 3 года назад
Is SOLID applicable to React development or Express app? Is it awkward?
@yuliusseraph4973
@yuliusseraph4973 2 года назад
yes, solid principles apply even to non-OOP paradigms like functional programming
@bernardwodoame9850
@bernardwodoame9850 Месяц назад
Isn't this also similar to the strategy pattern?
@miniappletheapple
@miniappletheapple Год назад
How the simple UML in the video is made?
@typingcat
@typingcat 7 месяцев назад
So.... this thing "dependency inversion principle" with a very long name, just means using interface not concrete classes?
@bboydarknesz
@bboydarknesz 4 года назад
Thanks!!!! I have a question, how to make sure that both StripePaymentProcessor and the other one have pay method? By implement Interface is good idea???
@deadrat2003
@deadrat2003 4 года назад
yes, you can make an interface class, then create classes that implement the methods
@jy_chen
@jy_chen 3 года назад
a base PaymentProfessor interface that enforces makePayment() method is a good idea, since it is reasonable to assume that all payment methods will make payment, so other the substitute principle is satisfied also.
@kuldeepchopra6594
@kuldeepchopra6594 Год назад
Can we achieve interface segregation principle using DI?
@matelenard894
@matelenard894 2 года назад
Do you have a masters degree in computer science? If not I do have one a piece of paper but you are smarter than me!
@kalicrowamusic3315
@kalicrowamusic3315 2 года назад
Isn't the wrapper dependent on the payment API and not the other way around? so you're just adding an intermediary class in-between to essentially normalize the differences between the different payment APIs?
@innai_fox
@innai_fox 4 года назад
What a great explanation! Thanks a lot ^_^
@WebDevSimplified
@WebDevSimplified 4 года назад
You are very welcome!
@guruprasathcs4197
@guruprasathcs4197 3 года назад
Hey, please cover all the 22 GOF design patterns.
@Mathwizzy16
@Mathwizzy16 4 года назад
Does this mean we need to create middleman classes/functions whenever we have dependencies on external third-party api's? Should we do the same if we have have dependencies on internal modules(if it is a big/long module) we ourselves created?
@skewty
@skewty 4 года назад
Coupling is only bad in one direction. Also don't couple high level business code / computation code with low level data storage / access code. Uncle Bob is probably the most famous SOLID guy. Checkout some of his videos if you are interested in further developing your understanding of SOLID.
@truthzp
@truthzp 4 года назад
There are no interfaces in Javascript? How can you be sure that each type of *PaymentProcessors has method 'pay'? Or should you check it manually in Store class?
@WebDevSimplified
@WebDevSimplified 4 года назад
Unless you use something like TypeScript you cannot guarantee this. It is just something you need to know when developing the code.
@WebDevCody
@WebDevCody 4 года назад
You could write unit tests that verify certain functions exist on both
@rogertunnell5764
@rogertunnell5764 4 года назад
Simple version: Check that the pay method exists before setting this.paymentProcessor. if (typeof paymentProcessor.pay !== "function") { throw new Error('Store.paymentProcessor requires method pay ' ) } Sophisticated version: Create a NullPaymentProcessor class that contains the required methods, but they throw a descriptive error (or handle the exception some other way, depending on your implementation) , then make StripePaymentProcessor and PayPalPaymentProcessor extend the NullPaymentProcessor class. class NullPaymentProcessor { pay() { throw new Error(`No pay method defined in ${this.constructor.name}. pay is a required method`) } otherMethod() { throw new Error(`No otherMethod defined in ${this.constructor.name}. otherMethod is a required method`) } } class StripePaymentProcessor extends NullPaymentProcessor { constructor(user) { super() this.stripe = new Stripe(user) } } class Store { constructor(paymentProcessor) { this.paymentProcessor = paymentProcessor } purchaseBike(quantity) { this.paymentProcessor.pay(200 * quantity) } } const store = new Store(new StripePaymentProcessor('John')) store.purchaseBike(1) output -> No pay method defined in StripePaymentProcessor. pay is a required method More or less, use the null object design pattern to implement an interface in javascript. Kyle, would you agree with this approach?
@AS-kc9oy
@AS-kc9oy 4 года назад
But what is the point of making two abstract classes instead of one? Make one, make a init function, a makepayment function and the paypal/stripe fully inherit that and you define what you want. The only thing that happened is that instead of defining a new entity Paypal and using the function, you added a new class which calls the subclass.
@iamchets
@iamchets 4 года назад
thats what I was thinking. The paymentProccesor could implement a strategy pattern right? Which keeps it all clean and simple
@hammadpervez4568
@hammadpervez4568 3 года назад
love your videos
@Testing-v4s
@Testing-v4s 4 месяца назад
Isnt it looking same as dependency injection
@n3x4r3
@n3x4r3 3 года назад
Nice man, thanks a lot ! sometimes the solution is simple but me head is a mess and doesn't help. :)
@DrewSorensenMusic
@DrewSorensenMusic 7 месяцев назад
Kinda funny. My company is currently implementing Stripe into our infrastructure. The project has taken 8 months. I’m QA. No real visibility to the code. But it must be breaking multiple design principles to take this long.
@digiartpassion8513
@digiartpassion8513 2 года назад
Where is the source code in github, ??????? couldnt find it
@elierh442
@elierh442 3 года назад
Please consider adding links to your code examples.
@juanandresmezzera9304
@juanandresmezzera9304 4 года назад
This kind of stuff screams for the use of interfaces (I know they are not supported in JS, one of the reasons I moved on to TS) In this case it's the responsibility of the developer to make sure all paymentProcessors implement -correctly- the method pay
@mastermitch12
@mastermitch12 2 года назад
This is exactly what I was thinking. Programming without interfaces always looks so cumbersome. This could have been resolved in a much simpler way with an interface.
@sujitwarrier4857
@sujitwarrier4857 4 года назад
So this gives the same advantages that dependency injection gives in .net can make coupling loose
@zeluciojr
@zeluciojr 4 года назад
Hmmm not sure! Dependency inversion is a type of dependency injection. What is special about this kind of DI is that you do not declare in any moment what concretion will be used inside the high level classes, it leaves it to the client code in which the high level class will be instantiated. Not any dependency injection works like that, after all it's possible to design a dependency injection declaring a low level class inside a high level class, which violates the dependency injection principle, making the high level class get to meet the low level class, generating coupling.
@FG-qs8uj
@FG-qs8uj 4 года назад
Is dependency inversion the same as abstraction?
@WannaTalkToSamson
@WannaTalkToSamson 4 года назад
Dependency Inversion is a form of abstraction, but not all forms of abstractions are Dependency Inversion. Basically, you use DI when you're implementing something that can be done in multiple different ways and you may need to change/support other ways in the future. Besides the Payment Processor example in the video, another example would be if your app had a "share to social media" feature. Say you only wanted to have an option to share to facebook now. You could make a facebook class & shareToFacebook() method that shares your content to only facebook. But now if you decide to add options to share to twitter or instagram later, you're going to have to edit multiple places in your code base to support this. Now imagine if instead of creating a facebook class & shareToFacebook() method, you created a SocialMedia class and a generic share method that can be passed in a specific type of social media. Now you only have to extend the SocialMedia class to support twitter, instagram, etc and you don't have to go and edit your whole code base like you would in the facebook class example. Hope this makes sense, good luck!
@mehdiparsaei1867
@mehdiparsaei1867 3 года назад
Thanks for teaching! Call your "Payment Processor", "Payment Handler". In my opinion, it does make sense more. What do you think?
@rick2402
@rick2402 4 года назад
Why is it called inversion though?
@kishorekumarmuthu6463
@kishorekumarmuthu6463 7 месяцев назад
9.41 He said oops in oops concept 😀😃
@tahasaleh4697
@tahasaleh4697 4 года назад
You should write a book!
@WebDevSimplified
@WebDevSimplified 4 года назад
I have thought about it but I am a bad and slow writer my weekly blog posts already take me a really long time to write compared to most people.
@tahasaleh4697
@tahasaleh4697 4 года назад
@@WebDevSimplified Your videos are still awesome and "simplified" :) keep them coming. Video suggestion: A JavaScript learning roadmap which gets more complex the more you advance (Junior, mid-level and senior). As most roadmaps out there focus more on the web-dev path in terms of tools and technologies, but non goes in depth in terms of the language itself and CS concepts.
@usama57926
@usama57926 4 года назад
@@WebDevSimplified Slow and steady wins the race........
@WebDevSimplified
@WebDevSimplified 4 года назад
Great idea. I will for sure add this to my list.
@marccawood
@marccawood 4 года назад
In practice these abstractions make code difficult to read and navigate: you keep getting to abstract interfaces and then having to back reference and sometimes guess which implementation is used. The whole idea is that we may easily swap out implementations but in practice this is surprisingly rare.
@mikethiem3628
@mikethiem3628 3 года назад
Depends on the kind of software you write, sometimes it's very useful. It also facilitates decoupling which can reduce build time in compiled languages and makes it easier to unit test your modules separately which is in my opinion the real reason to do this.
@Despamifier
@Despamifier 3 года назад
Looks pretty similar to MVVM concept
@hdching
@hdching Год назад
I was looking for the interface class then I realised it’s JavaScript 😂
@candle-likeghost9523
@candle-likeghost9523 3 года назад
funny enough, we you experience pain in coding and slowly walk your way out for cleaner code, you might unconciously applied SOLID principle without knowing it
@alexcubed4270
@alexcubed4270 4 года назад
Haha, I see you fixed your floor mat issue? :P
Далее
Solid Programming - No Thanks
32:00
Просмотров 297 тыс.
Dependency INVERSION vs Dependency INJECTION in Python
17:51
Dependency Injection, The Best Pattern
13:16
Просмотров 817 тыс.
Junior Vs Senior Code - How To Write Better Code
22:13
Dependency Injection & Inversion of Control
11:00
Просмотров 197 тыс.
Top 6 React Hook Mistakes Beginners Make
21:18
Просмотров 572 тыс.