Prime Reacts: The Flaws of Inheritance

  Рет қаралды 300,252

ThePrimeTime

ThePrimeTime

Жыл бұрын

Recorded live on twitch, GET IN
/ theprimeagen
original: • The Flaws of Inheritance
author: @CodeAesthetic
MY MAIN YT CHANNEL: Has well edited engineering videos
/ theprimeagen
Discord
/ discord

Пікірлер: 715
@yurikadzz
@yurikadzz Жыл бұрын
I love how CodeAesethic just came from nowhere, proceeded to release some bangers and now is easily one of my top 3 fav programming youtube channels lol
@animowany111
@animowany111 10 ай бұрын
Nemean was even crazier, just dropped the Quake q_rsqrt video and got like a million views and tens of thousands of subscribers with only one video on his channel
@andrewhooper7603
@andrewhooper7603 10 ай бұрын
@@animowany111 Not programming, but Bobby Fingers' view to upload ratio is insane. Guy comes out of nowhere and drops a 20 minute video that is currently sitting at half a million views 10 months later.
@XDarkGreyX
@XDarkGreyX 10 ай бұрын
And mia for a while
@pixelpox11
@pixelpox11 5 ай бұрын
I dislike quite a few of his videos. They feel like they were made by person that writes 100 lines of code and names it a project, and therefor it's not relatable to actual production code.
@cheerwizard21
@cheerwizard21 5 ай бұрын
@@pixelpox11 I agree with you. Even the actual name of channel "code aesthetics" already sounds very weird, since code is not a book or poem, it's a machine instructions :)
@thekwoka4707
@thekwoka4707 Жыл бұрын
I definitely agree with that whole "when you're shown this it makes perfect sense". Like the idea of inheritance is smart, and practical, and obviously a decent way to do it. Then you see a codebase that actually uses it and it's such a complete cluster fuck and it's so hard to keep track of what anything is supposed to be.
@prestonrasmussen1758
@prestonrasmussen1758 Жыл бұрын
I think the issue is that inheritance is often taught with examples that describe existing properties or functionality. People will often use the example of having a square class that inherits from a polygon class. The issue is that this works because you’re classifying existing functionality. When creating something new, the analogy falls apart. Companies don’t have a Vehicle blueprint that they then extend to either get a Car blueprint or a Motorcycle blueprint to the build. They build the Car and Motorcycle completely separately.
@BillClinton228
@BillClinton228 Жыл бұрын
Yeah I think people take it too far, I worked for a company which only employed "Senior Developers" and had 2 juniors to do really menial stuff. Some of the software those "Senior Devs" wrote had so much inheritance if you wanted to go down the rabbit hole it would take you hours to figure it out. Thats really bad code architecture and I don't think you can call yourself a "Senior" anything if you don't think about how your code reads to a person who's not familiar with the structure.. At the same time though, these devs would be very critical of how you named your classes and methods, so you don't care about how your code reads but you really care about what a class is called? That doesnt make any sense to me.
@moonasha
@moonasha 10 ай бұрын
doesn't it just depend on how it's implemented? For example, in my game, every item inherits from the base world object class. This class handles temperature and other things like that, so anything that affects temperature can easily do that. Then an example of an item is a tool. The tool has base things like, how it can hold items, how you can remove items from it, and whatnot. And then there's specific tools that have their own specific behaviors for items in the tool. I just want to know, how in god's name would you approach any of that without inheritance? I genuinely want to know. And I think if done well it's just common sense what things are supposed to be
@Mitch_Crane
@Mitch_Crane 10 ай бұрын
​@@moonashaDoes your game have weapons? If so, would a weapon be a subclass of item? What would happen if I wanted a hammer to act as both a tool and a weapon, or a baguette as a weapon and food etc. This flexibility might not be necessary for whatever you're building but it's something to consider
@romannasuti25
@romannasuti25 10 ай бұрын
Yep, and honestly there’s some codebases that spoil us rotten and make it seem so good because the focus is so constrained that object orientation is good. Perfect example is game engines and really popular large web frameworks. Even then, there’s limits and people end up running into issues. Want to see a HORRIBLE OOP library? Read LangChain, and try to figure out how Conversational Agents pass through chat_history, this nearly drove me mad. If you’re wondering why it’s that way, they release a new version of the library roughly every 1-2 days (absolute chaos of a commit history) and they prioritize maximum flexibility above LITERALLY ALL ELSE.
@mmzzzmeemee
@mmzzzmeemee Жыл бұрын
i'm a fan of that channel, the way he explains is quite like he's the 3blue1brown of programming.
@WillEhrendreich
@WillEhrendreich Жыл бұрын
And that should be emulated everywhere!
@JohnZakaria
@JohnZakaria Жыл бұрын
I would say the 3blue1brown of CS is reducible, he goes deep into CS topics
@mayabartolabac
@mayabartolabac Жыл бұрын
yeah code aesthetics is more like the 3blue1brown of medium articles
@liviousgameplay1755
@liviousgameplay1755 Жыл бұрын
I'd say he has some of the same traits of 3blue1brown, don't want your comment to get outdated if 3blue1brown changes how he makes vids.
@jffrysith4365
@jffrysith4365 5 ай бұрын
@@JohnZakaria I really don't think that calling codeAesthetic the 3blue1browne of CS is very accurate, programming is significantly more accurate. Like the topics he covers is: - how to make code easier to read - how to make code more extendible - how to design code effectively (yes this is a mix of the above). What he isn't covering is: - how the computer works fundamentally - complexity analysis - math What he's covering is significantly more accurate to call it programming than CS. And this isn't a bad thing btw. I find it funny when people think monkeybrain "CS good, programming bad". But saying that, they aren't the same topic, computer is understanding why we design code, how we can analyse code, and even lower how a computer works. It's even to find the limitations of code. Programming is a part of CS, and this is what CodeAesthetic is explaining (really well).
@theondono
@theondono Жыл бұрын
Inheritance only works on paper because it forces you to go backwards. Programming tends to happen bottom-up, you start with some core functionalities, and write more and more stuff on top. OOP requires you to work top-down, which necessitates knowledge of the full problem upfront. That’s why it works on paper (small exercises) but fails on the true stuff. I’m not sure if you can build inheritance to work the other way round, but it’s clear Rusts traits are much closer to this, that’s why they feel nicer.
@ThePrimeTimeagen
@ThePrimeTimeagen Жыл бұрын
agreed
@gagagero
@gagagero Жыл бұрын
That's a really good way of describing it. Tbh, I prefer inheritance over composition, but it requires much more work to do it right.
@prestonrasmussen1758
@prestonrasmussen1758 Жыл бұрын
I learned to program from a top down approach and I definitely find it very useful for working out problems. I barely ever use inheritance though
@RobertSmith-lh6hg
@RobertSmith-lh6hg Жыл бұрын
Underrated comment. I would expect if one were to poll pro-OOP vs anti-OOP programmers there would be a strong correlation between top down vs bottom up design mentality.
@MrHaggyy
@MrHaggyy Жыл бұрын
Depends on what your true stuff is. In embedded stuff, especially safety critical stuff you get a much tighter contract than any "big tech" company has ever written. Not uncommen to get a close to full coverage unit test alongside a project. But most of the time we use inheritance to fit some code into memory constraints. Something most desktop or server programmer don't need to bother with. At least not to the extend of, if we really need the bigger chip we lose millions of dollars.
@alfred0231
@alfred0231 Жыл бұрын
I like Jonathan Blow's take on design paradigms: " The benefits are obvious because the thing got proposed because of its benefits and you'll hear about the benefits. The cost tend to be subtle and/or swept under the rug by the people that want to sell you on the benefits." - 'Jonathan Blow on unit testing and TDD' (7:25)
@michaelharrington6698
@michaelharrington6698 9 ай бұрын
Amazing commentary
@name_cpp
@name_cpp Жыл бұрын
LMAO the curly brace thing at the beginning, finally someone else who HATES newline braces
@ThePrimeTimeagen
@ThePrimeTimeagen Жыл бұрын
it hurts me
@MangoDev_
@MangoDev_ Жыл бұрын
and yet so many different style guides say not to >:(
@NeoChromer
@NeoChromer Жыл бұрын
Thats actually a best practice for # and Java
@NeoChromer
@NeoChromer Жыл бұрын
C#
@samochreno
@samochreno Жыл бұрын
@@NeoChromer not for c#
@IanRiley915
@IanRiley915 Жыл бұрын
I love how Prime calls out CodeAesthetics for the next line curly braces and then rhetorically asks whether it's C# because C# standards infamously use next line curly braces. Then I double check the code and realize that it is actually C# code.
@jaysistar2711
@jaysistar2711 7 ай бұрын
The file savers should really just be functions that take some sort of writable object, an image, and options. There really doesn't need to be a class, since that just creates an unnecessary alias to the image and options.
@marcs9451
@marcs9451 4 ай бұрын
the OOP mind cannot comprehend this
@sfulibarri
@sfulibarri Жыл бұрын
Never heard of the triple method but thinking back, its seems to be categorically true in my experience. I've seen lots of new products fail after months of effort because we didn't know all the things we learned in the first attempt but the 2nd pass usually ends up shipping and doing well. Whenever I've worked on proprietary framework level things it does seem like it takes at least two but often three passes for it to be fully baked and desirable to the org.
@TehKarmalizer
@TehKarmalizer Жыл бұрын
Inheritance has its place. It can definitely get out of hand. Composition has its issues, but he made the point that some of those issues might be due to putting too many responsibilities on the composes objects. Some of the issues with inheritance can surely be traced to the same.
@ifeoraokechukwu1346
@ifeoraokechukwu1346 8 ай бұрын
Spot on!
@jacoboblanco1555
@jacoboblanco1555 Жыл бұрын
That description of developing software in a 3ply-fashion is brilliant. Totally tracks sometimes you build it to understand what it does, then build it to make it ready for others, then build it to make for you and others in the future.
@kiyotaka627
@kiyotaka627 Жыл бұрын
I love this channel and the long video format, for me that can't manage to watch the streams, this is gold
@sadboisibit
@sadboisibit Жыл бұрын
Holy moley I think it's been at least 10 years since I've heard anyone bring up Microsoft XNA.
@ThePrimeTimeagen
@ThePrimeTimeagen Жыл бұрын
yeah... i did it!
@oliverdenton2833
@oliverdenton2833 Жыл бұрын
I quite like these 2nd channel videos. The volume of clips and more of a focus on Actual Programming concepts, rather than the 'hot-takes' to just drive engagement like the main channel. I like seeing the M who just likes to help people get better.
@st-jn2gk
@st-jn2gk Жыл бұрын
your advice on capital D Design and your 2-level way of writing production code is really REALLY helpful. Thank you.
@FrankHarwald
@FrankHarwald 8 ай бұрын
"Who puts curly braces on the next lien?" Most C programs from the Unix world is written in this style - except kernel hackers & GNU software.
@5h4ndt
@5h4ndt 2 ай бұрын
I learned it that way, but have since converted.
@thfsilvab
@thfsilvab Жыл бұрын
"Avoid protected member variables with direct access" - when I was learning Android Development in Java, this KILLED my motivation entirely when trying to reason with the code, some view operations intensively use protected members from the parent class and I kept asking myself where those members were coming from...
@aoeu256
@aoeu256 11 ай бұрын
Why not use the Python naming conventions to add _ to protected and __ to private (name mangled).
@cheerwizard21
@cheerwizard21 5 ай бұрын
Just add correct code convention. m_ - protected member variables. p_ - private variables. Well in any case you can just look into a codebase and find what this member variable is actually doing. I didn't really understand your concern.
@nonnodacciaio704
@nonnodacciaio704 Жыл бұрын
I use both new line and same line curly braces at work depending on the language and their relative best practices, so yeah you don't die from it
@T33K3SS3LCH3N
@T33K3SS3LCH3N 11 ай бұрын
I got to work on an old project where all the important bits happened in business objects that were pure spaghetti of inheritance. EVERYTHING happened through protected variables and methods. You would see a 5-line function and think that that should be easy enough to understand... but then it ends up triggering 500 lines of code across 5 levels of inheritance. And it would go up and down, up and down... Line 1 out 5 executes something in its parent, but that is passed right through to the grand parent. So the grand parent does some things, then passes it to the GRAND-GRAND-parent, which executes like 10 lines before it goes back to the grand-parent. The grand parent does a few more lines before calling something that passes through to the GRAND-GRAND-GRAND parent... which calls some completely other module... and from there it falls back to the original child object I was working on. One line done, get ready for 4 more...
@jakal13
@jakal13 Жыл бұрын
This is the first reaction video I liked - ever. You complement each other so well. It is like you inherit his evil genius and implement an emotional amplifier of profanity into it.
@mrrolandlawrence
@mrrolandlawrence 7 ай бұрын
as a silver haired coder from the 1980s OOP & inheritance was the bees knees. on paper. awesome. in reality - i watched programmers inherit the crap out of stuff, till it was just crap. So deep that even a Matryoshka doll would have gasped. also kudos for your music tastes there with miss monique.
@alek282
@alek282 Жыл бұрын
I really connect with Prime's idea of 3 stages of writing an application. Coming from embedded development, I am very used to separating data and methods on data, and even now that I work on higher plane of abstraction I often always write my first version as a combination of data containers and methods on them. What I find is that often times on subsequent re-factors that pattern alone is sufficient without even going towards OOP way of structuring your code. I am not generally opposed to it, but in my experience it's far easier to first do the simplest thing first (data + methods on data) and if you spot patterns - refactor them however it makes sense to refactor them. Using classes to structure your code from the beginning IMO is hard to get right even for experienced devs, inheritance or not, you are still effectively dealing with lots of local namespaces and are dealing with "this object owns this and that object owns that", if you then need to share some data, it's more work to make these changes compared to if they were simply passed in as a parameter to some method I also feel that having a very clear way of identifying data within your program is often very beneficial and illuminating. I suppose this is more towards data oriented programming approach
@HrHaakon
@HrHaakon Жыл бұрын
My experience is that if you're having a clump of data, and then some operations on that data, it's pretty easy to get it done using OOP. Will you have to refactor a lot? Maybe. But it's pretty easy to think in terms of. Then again, I model the database FIRST these days, as nailing that is pretty reasonable, and then the OOP layer on top handles messaging between the data model and the front end. So it's like the controller in the way MVC was originally conceived. It works really well for enterprisey solutions.
@spicynoodle7419
@spicynoodle7419 8 ай бұрын
Data duplication is good when it leads to a more decoupled codebase. You don't always want a giant users table with 100 columns because every part of your system needs parts of the table. Adding an extra column suddenly breaks everything because other parts of the project are now trying to insert null into the new column.
@CodeTalker23
@CodeTalker23 Жыл бұрын
the rust default impls of traits is available in C# as well (also C# allows Data Members in interface but not entirely since Properties are methods and not fields so it feels like it does when it actually doesn't)
@khatdubell
@khatdubell Жыл бұрын
Agreed. Its also existed in c++ since forever. Not sure why he was gushing so much about it in rust, its not a new concept
@m4rt_
@m4rt_ Жыл бұрын
2:40 that is because they don't tell/show you how painful it is to change the structure of it after it has been coded . They show it from the perspective of a world where everything is easy, and is correct on the first try. (I have not gone to college for programming, so I don't know if that is the case, but it sounds like that is why)
@y200sub
@y200sub Жыл бұрын
I have studied OOP in college a long time ago and this is exacyly how it is shown, OOP has its place but we have gone too far in making everything abstract and that in turn made things worse.
@khatdubell
@khatdubell Жыл бұрын
Schools teach you how, not why. So when they introduce a new hammer, people want to try and hit everything that looks even remotely like a nail with it.
@Danielo515
@Danielo515 Жыл бұрын
I already watched this video, but watching again along with you was so fun…
@Sammysapphira
@Sammysapphira Жыл бұрын
I agree with you on smooth scrolling. There's a reason why scrolling was originally in steps and it's because it causes less motion sickness. I am not particularly prone to motion sickness, but I find it much harder to read stuff when they're smooth scrolling, even on a 144hz monitor. The greatest demonstration of this are youtube live comments vs twitch, where the former is smooth scroll and the latter is bulked into steps. Twitch chat is legible when it's being -SPAMMED-, I'm talking 100 messages a second spammed. KZbin chat is barely legible with 5 messages per second, because it's constnatly scrolling up, there's no rest for your eye to actually read the words.
@TRobStudios
@TRobStudios 8 ай бұрын
Did XNA in college senior year, I loved it. Glad to hear I wasn't the only person who used it. I made a pacman and tetris clone in it and was so excited to deploy it to the first generation of windows 7 phone. RIP windows 7 phone, never got flash support and was too late to the market
@stevo728822
@stevo728822 5 ай бұрын
I've been viewing your back catalogue of videos and this is by far the best one so far. Started programming with COBOL and DB2 on IBM mainframes back in 1990. Now I just do Godot and Python for selling small games off Steam.
@demolazer
@demolazer 11 ай бұрын
So true. When learning programming, inheritance seems so logical and endlessly useful. Yet much of the more advanced programming literature/videos points out that composition is often better.
@Hazanko83
@Hazanko83 Жыл бұрын
I love my next line squirly braces... especially in a language where things can occur between functions and their scope, such as declaring a function const, or member initializers, or metaprogramming(?) such as std::enable_if, or any other number of things. Lines come free, readability doesn't. MyClass::MyClass(int value_1, int value_2) : member1(value_1), member2(value_2) { //stuff }; ^^ isn't too bad until you have longer type names, or more parameters, or more going on with the class/function/etc. MyClass::MyClass(int value_1, int value_2) : member1(value_1), member2(value_2) { //stuff }; ^^ is so much easier to read and is much easier to be consistent with in different situations.
@BeamMonsterZeus
@BeamMonsterZeus 8 ай бұрын
Prime is on fire in this one
@sentientmachine2850
@sentientmachine2850 Жыл бұрын
I already watched every single video, super cool insights
@juanandrade2998
@juanandrade2998 10 ай бұрын
Imo the only good way to have this conversation is by looking at what the compiler does. For example each time the compiler sees a dereference (dot operand) it performs an extra instruction for null checking, while local variables are accessed directly. And if we get even more exquisite... Local assignment(dereferencing a field to the method stack is supposedly even faster... But the assignment tradeoff needs to be matched against the number of times the reference will be accessed.
@marioamatucci
@marioamatucci Жыл бұрын
hey dude- plz make a video explain dependency injection and inversion of control for the masses
@NithinJune
@NithinJune 3 ай бұрын
dependency injection was our bread and butter in high school robotics. We split the robot into subsystems and everything would be injected into relavent methods and classes. Was a massive pain
@jonaskoelker
@jonaskoelker 8 ай бұрын
> A [pee enn gee] is called a ping I'll update my pronunciation in a giffy.
@stendaneel4879
@stendaneel4879 7 ай бұрын
6:25, just use the virtual keyword instead of abstract. This will allow you to define and write code in the function inside the abstract class. This allows you the ability to override it in inherited classes while not being forced to.
@YourComputer
@YourComputer 10 ай бұрын
The video doesn't present a problem with inheritance. If anything, all it does is reveal the necessary foresight and experience required to construct a feature-rich, well-designed API. It just so happens that the lack of such things are naturally inherent in humans, and this by default. Also, inheriting from an interface *is* inheritance.
@marcs9451
@marcs9451 Жыл бұрын
The solution to the image problem the video presents could be far more easily solved in practice with a single Image struct and some associated methods for editing + separate load/write functions to different image formats (maybe a ImgConverter interface if needed). The video is good but usually these OOP examples are overly complicated for no reason other than trying to fit a mental model of classes
@MasterHigure
@MasterHigure Жыл бұрын
That's the point, though. You have some class that works just fine, but then one day you want to extend it. Doesn't matter how cleverly your inheritance structure solves the current requirements. The moment a new requirement is added, the resulting refactor is huge. Sure, you can solve the problem given here, with a drawable / non-save-and-load image just fine if you know that that's a requirement from the get-go. But then something new comes along.
@marcs9451
@marcs9451 Жыл бұрын
Actually the method I proposed is way more flexible, as the image manipulation logic is separate from the conversion logic. Want more formats? Simply write a new save/load function pair and pass an Image struct to it.
@TheBrazilRules
@TheBrazilRules Жыл бұрын
@@marcs9451 How is writing more functions different from having them as methods in the classes?
@aoeu256
@aoeu256 11 ай бұрын
@@MasterHigure The problem with inheritance when I used it (maybe bad at OOP) is mutation/global state is order dependent, and if you inherit something the child classes may sometimes want to call the super method first before the body sometimes last and it could lead to subtle bugs because of state, you sometimes have to have the super method be a higher order function so it can be called around your code. Also sometimes you have to have the parent call the parent version of a method other times you want the parent to call the child method...
@fluffydoggo
@fluffydoggo 11 ай бұрын
@@MasterHigure extension methods 😎
@Kitulous
@Kitulous Ай бұрын
it's C#, the opening brace on a separate line is the default and the norm there. the methods that start with a small letter, though... A SIN! AN UNFORGIVABLE SIN! the only things that start with small letters in C# are local variables, parameters and private fields! (private fields also typically start with _ but then a small letter follows) (I'm talking identifiers, of course keywords (int is also a keyword) start with small letters)
@loganrogers4560
@loganrogers4560 21 күн бұрын
I know it's an old video but I'm so glad I found this channel. KZbin addiction is my greatest struggle as a junior dev that just has been coasting in his work. I know this channel is primarily entertainment but replacing some of the political trash that I normally binge with your content is starting to improve my mindset and problem solving skills and I'm noticing improvement and growing competence at work as a full stack dev. Coming from a game dev degree that I'm sometimes not proud of you're really helping me fill gaps in my knowledge base that I missed in my formal education. That said I'm happy I went to college for game dev, got me into coding and even if I was disillusioned by the industry during salary negotiation it got me started down this path and it's something I'll never take back.
@Panakotta000
@Panakotta000 8 ай бұрын
My biggest problem with composition in Rust, especially those default implementations for functions of a trait... is that when these default implementations rely on state, you always have to provide accessor functions within the trait... and in rust you often need two for the same value, one for immutable and one for mutable state... this forces the struct that implements said trait, to implement these accessors even if they just point to a single field in the struct... depending on how many such traits you have this can cause a lot of boilerplate code
@dustmighte
@dustmighte 4 ай бұрын
I believe pretty strongly inheritance is only good for composing orthogonal behaviors. Inheritance for specialization opens the door to overriding, calls to super and having to understand multiple versions of the same artifacts but jumping back and forth between modules to understand what each does. My brain doesn't compute that.
@JackDespero
@JackDespero 9 ай бұрын
You joke, but the next-line curly braces is the main and probably only reason why I refuse to use Black for Python. I just can't. I can't.
@indignocat
@indignocat 8 ай бұрын
Lovely Tetris-inspired graphical explanations, btw
@johnt1342
@johnt1342 7 ай бұрын
25:03 Yeah, I've thought about this a bit and have been curious if it's not a bad idea to have an `embodies`, `compose`, or a similar keyword. The idea would be that within your class you would say that it embodies another object, which you can then access it's methods as if it's your own, but they would be private. Mostly a convenience feature, it would benefit from the IDE informing you which component you are fetching the method from, but I haven't thought of a scenario where it would be dangerous (yet.)
@iwky1930
@iwky1930 Жыл бұрын
I love new line curly braces looks cleaner and more symmetrical.
@aonodensetsu
@aonodensetsu Жыл бұрын
i can relate to making things three times, finally finished up my third full rewrite of my github repositiories today and beginning to do the same for my portfolio website
@MorningNapalm
@MorningNapalm Ай бұрын
I use next-line braces. It puts a little extra vertical space in exactly the right places.
@mattrs1
@mattrs1 9 ай бұрын
An example of where inheritance makes sense is Pokémon: you have the definition of a pokemon(name, evolution, moves it can learn, abilities it can have, base stats). Then you have a class to express a pokemon in your team (has ivs, evs, only four moves out of whatever it can learn, a personality, only one ability) and from the pokemon class it helps to validate if it can learn the move, calculate actual stats based ob ivs and evs and so on. But then I wouldn't do a battle class that inherits from pokemon, items and so on
@djl3009
@djl3009 Жыл бұрын
@2:14 -- yes, it makes perfect sense on paper ...just like the waterfall model for development made perfect sense on paper.
@timedebtor
@timedebtor Ай бұрын
This feels like almost an exact replica of a Raymond hettinger talk, but there was obviously a lot of care and love put into visualization and video development.
@oleksiistri8429
@oleksiistri8429 12 күн бұрын
I use classes mostly for packaging functions/logic into one thing, not for reusing, that way the code becomes simpler for me to read. BTW, I also use brackets as this guy does😂, to me it helps a lot to distinguish sections of code and helps the code to breath, thanks to surrounding space, which also adds up to readability
@tokiomutex4148
@tokiomutex4148 Жыл бұрын
Who needs inheritance when you have enums and traits?
@ThePrimeTimeagen
@ThePrimeTimeagen Жыл бұрын
these are facts you just hold my heart in a lock, i swear
@DeepFriedOreoOffline
@DeepFriedOreoOffline 8 ай бұрын
This video so purely speaks to an idea I've been thinking about for a long time. I keep seeing these videos floating around about why OOP is a lie, and why it doesn't do what it was made to do. Which was solve the lack of modularity in imperative programming. To be fair, it doesn't solve that problem, we have modules now. However, this is exactly why OOP has evolved over time. It's not about trying to make infinitely reusable code snakes, it's about breaking down large frameworks into easily definable objects that can be instanced to serve a higher purpose.
@veerpratap1177
@veerpratap1177 8 ай бұрын
is code aesthetic some kind of meditation asmr channel?
@songlover5973
@songlover5973 4 ай бұрын
Someone finally says gif the right way. Thanks for setting up my day to be a good one.
@halfalligator6518
@halfalligator6518 2 ай бұрын
It just depends how many "branches" of your core class there end up being. If say there are 30 variations.... then you'll probably have a hierarchy of inheritance with 3 or 4 "generations" to stop objects from inheriting too much. That can require a lot of pre-planning and can easily end up a mess. I'd usually prefer to use the modular approach of composition to form each sub type, but it really just depends on how many variations we plan on using and how worried we are about memory.
@Joker22593
@Joker22593 9 ай бұрын
Vertically aligned Squirrely Braces is 1000x more readable. This isn't the 1970s where newlines are expensive.
@moonasha
@moonasha 2 ай бұрын
my current strategy is, "Can I do it with an interface?" If the answer is yes, I don't use inheritance. There are some cases though where inheritance is super useful, but I live mostly in the game coding world so it probably doesn't apply elsewhere. As an example, a game would have a base object, that keeps track of temperature, who owns it, etc. Then more specific objects with certain functionalities can inherit from it, without having to duplicate a bunch of code. Basically for me it comes down to how much code you're duplicating
@marcr8181
@marcr8181 9 ай бұрын
I hope the conclusion of this video is, don't implement stuff that already exists out of the box in .NET. System.Drawing.Image supports BMP, GIF, JEPG, PNG and TIFF including Rotate / Flip. So extension method for scaling it is.
@skeleton_craftGaming
@skeleton_craftGaming 8 ай бұрын
Isn't that [having your brackets on new lines] like from the Google style guide or some other document that has the same weight as that? What's the standard and a lot of IDEs
@renkinjutsu01
@renkinjutsu01 8 ай бұрын
Go removes all the boilerplate from using Composition. It's absolutely beautiful. Then they added all that boilerplate to everything else.
@dasdeck
@dasdeck 8 ай бұрын
Aren't traits basically a superset of inheritance?
@SuperJJAlexander
@SuperJJAlexander Жыл бұрын
Code Aesthetics messed up with the inheritance diagram right before moving on to composition. The object on the right started with only blue and red square but ended up as a child of the green and blue object.
@Jabberwockybird
@Jabberwockybird 3 ай бұрын
That's kinda the point. If your system is too messed up with ideas that are more complex than they need to be, then you'll make mistakes
@martinbecker1069
@martinbecker1069 Жыл бұрын
When you were describing how default implementations can make use of defined but unimplemented methods, that is default implementations can only call methods it knows about (other methods defined within the trait), does that "methods it knows about" also include methods defined by traits that this trait requires to be implemented?
@HrHaakon
@HrHaakon Жыл бұрын
In Java, this is pretty simple: any method the interface knows about can be used. So I assume Rust must do something different, because being similar to Java is a deathly sin.
@SmartK8
@SmartK8 Жыл бұрын
His curly braces are symmetrical. That's real esthetics - real beauty. 💯
@toxicitysocks
@toxicitysocks 7 ай бұрын
Ok that rust thing is cool but I still love go’s implicit interfaces
@djchrisi
@djchrisi 4 ай бұрын
19:30: C# 8.0 was released 2019 and introduced default interface methods....
@TheGreatDazod
@TheGreatDazod Жыл бұрын
I don’t know if this purposeful or not but I appreciate here how your personality feel like you are channeling Dane Cook is he was a software engineer and I am here for it 😂 first video of yours I’ve watched to completion but I’ll be watching more now 😮
@Slashx92
@Slashx92 Жыл бұрын
I also made my first game with xna, a tower defense, and I also had like 4 levels of inheritance for only the attack effects lmao Oop obsesión was so bad when I was young
@ThePrimeTimeagen
@ThePrimeTimeagen Жыл бұрын
You have no idea how much I can relate to this
@MarcLucksch
@MarcLucksch Жыл бұрын
Java Swing goes full in on inheritance, and it's the only one case that I found actually useful and easy to hook into. Building UI, quickly changing a draw method here, or making a table behave like a tree. Once I got it, it was really easy. But designing that stuff myself to be flexible like that, no thanks.
@harleyspeedthrust4013
@harleyspeedthrust4013 Жыл бұрын
I did java for several years and i suffered at the hands of forced inheritance. Now i use literally anything other than java and i hate inheritance because it overcomplicates everything and forces you to fit the problem to the code rather than the other way around
@imblackmagic1209
@imblackmagic1209 Жыл бұрын
i use inheritance only for derivatives, the child classes only add new functionality, they may or may not alter some functionality (i usually prefer not to), and maybe implement some virtual methods to fit an API (or use interfaces) aside from that, i avoid it like the plague, if it's not needed, dont use it
@HrHaakon
@HrHaakon Жыл бұрын
C++, JavaScript, Python, C#, TypeScript and fucking COBOL has inheritance, and are fine, but not Java? Do people just not know how to write Java or something?
@harleyspeedthrust4013
@harleyspeedthrust4013 Жыл бұрын
@@HrHaakon I almost didn't reply because your comment severely missed the point, but I have a minute so I'll explain again: Java forces you to use classes and heavily encourages you to think about the problem in an object oriented way. (You don't have to of course if your classes are just function containers or bags of data but that is terrible Java. and as someone who knows how to write Java I'm sure you wouldn't approve.) This is not good because most problems are not cleanly represented in the pure OO inheritance world of Java. So while other languages may have inheritance, they also have more sensible ways of modeling code so that you never have to touch inheritance. Caveat with TypeScript: you should know about prototypical inheritance but you rarely have to actually use it. You can write a NodeJS application in TS that doesn't touch prototypes or explicit classes ever.
@HrHaakon
@HrHaakon Жыл бұрын
​@@harleyspeedthrust4013 You don't need to use a lot of inheritance in Java. Stop trying to sneak in that assumption.
@harleyspeedthrust4013
@harleyspeedthrust4013 Жыл бұрын
@@HrHaakon I didn't sneak it in. I made it pretty clear that you don't have to use inheritance in Java but if you don't then you're writing what Java people would call "bad Java." Maybe next time read the comment.
@laharl8417
@laharl8417 Жыл бұрын
!Wow its a really nice video! I learned a lot!
@not_ever
@not_ever Жыл бұрын
I clang-format on save with whatever defaults it considers the best. So because IDGAF enough to create a .clang-format file it does my braces on new lines. At first it would cause me geniune aggrievement but honestly you learn to accept it and move on. I work with C++, my life is shitty enough.
@PP-ss3zf
@PP-ss3zf 8 ай бұрын
next line squirly braces have grown on me! and yes, this is c sharp
@victorolvera6482
@victorolvera6482 Ай бұрын
When implementing a compiler inheritance is elegantly straight forward. Functionality is presumed from the way objects are structured in memory. Where as composition there has to be an active mechanism in determining if such particular object contains a particular functionality. Maybe inheritance is a house of cards that may apart due to design issues. But when it works it should be more efficient then composition
@victorolvera6482
@victorolvera6482 Ай бұрын
Inheritance is an O(0) solution where as composition is O(1) at best.
@guillermocava3568
@guillermocava3568 Жыл бұрын
The triple method - harambe moment at 10:05 is pure gold
@RedHandedBug
@RedHandedBug Жыл бұрын
Oh baby a triple!
@SaHaRaSquad
@SaHaRaSquad Жыл бұрын
It's indeed the best way to produce quality software. Developers who think they can do it right the first time just haven't learned that lesson yet. RIP Harambe
@nekodjin
@nekodjin Жыл бұрын
"What is this, C#?" he says, while staring at a snippet of C# code. Yes, in fact, it is C# :p
@daltonyon
@daltonyon Жыл бұрын
These design patterns help a lot when you need change the code with minimum impact.. sometimes can be over engineering, but most pf cases not!! Prime continue with these videos because your lives most of time is in my work time and sometimes I can't watch and the Vod is to long!!!
@ThePrimeTimeagen
@ThePrimeTimeagen Жыл бұрын
awesome! i love to hear that dalton :)
@Zed_Oud
@Zed_Oud 8 ай бұрын
1 for agree 2 for disagree? Only 12 zeroes
@DaveRogers-et4cv
@DaveRogers-et4cv Жыл бұрын
Those curly braces on the same line are standard practice in C#. Any linting tool would complain if you did anything different to that. They are called automatic properties and they are awesome.
@Ormaaj
@Ormaaj Жыл бұрын
Meme, not standard practice. Entirely due to historical VS defaults.
@DaveRogers-et4cv
@DaveRogers-et4cv Жыл бұрын
@@Ormaaj You are wrong.
@Ormaaj
@Ormaaj Жыл бұрын
🤣No I have superior taste.
@DaveRogers-et4cv
@DaveRogers-et4cv Жыл бұрын
@@Ormaaj Wrong about that, as well. That's the thing with you. Always wrong.
@Ormaaj
@Ormaaj Жыл бұрын
Whatever newline-curlybracer. At least I'm not wasting all the world's supply of vertical whitespace
@Amy_A.
@Amy_A. Жыл бұрын
I agree that using ?. without another condition is terrible. I think it has a ton of use though, as long as you follow it up with "?? someDefaultValue" or other handling. Hiding an error with it is terrible. Consolidating error handling with it, however, is beautiful.
@blarghblargh
@blarghblargh 6 ай бұрын
lol. when in C# code like C#. He should be Pascal casing method names tho. I don't like it either. But that's the MS guidelines, probably best to just follow it and deal.
@Mad3011
@Mad3011 9 ай бұрын
If there's even a grain of truth to Conway's law, it's quite obvious why inheritance based OOP became so popular in the corporate, top down, hierarchical waterfall world of the 90s. It's just how those organizations worked.
@marcr8181
@marcr8181 9 ай бұрын
The ? in C# doesn't hide a problem, it just is a short hand for if(obj != null)... If you don't know what you are doing it doesn't matter in how many ways the language offers you to do it wrong in.
@SergeySolovevS
@SergeySolovevS 8 ай бұрын
24:33 "emotional injection" perfect
@oblivion_2852
@oblivion_2852 Жыл бұрын
What do you think of query builders? I honestly can't stand query builders for sql. I'd rather look at a basic string with some replacement keywords or embedded variables.
@ThePrimeTimeagen
@ThePrimeTimeagen Жыл бұрын
they always seem so neet then... they become less neet
@oblivion_2852
@oblivion_2852 Жыл бұрын
@@ThePrimeTimeagen just... Why should I be learning a new structure/language with your query builder? If you just keep it as sql I can read it without having to figure out your custom representation of a query.
@HrHaakon
@HrHaakon Жыл бұрын
String replacement can take a long walk of a short pier, but SQL is better than 90% of everything else the SECOND you're no longer doing basic CRUD that's 1-1 with a single table with no joins.
@vovcheable
@vovcheable Жыл бұрын
Sendi Metz gave a great talk on this subject with guilded rose kata
@ccgarciab
@ccgarciab 10 ай бұрын
This is precisely why typeclasses/traits work so well
@yash1152
@yash1152 8 ай бұрын
14:44 how to _enforce_ the common function of save/load be called that across all different composed classes like formats classes in this example?
@yash1152
@yash1152 8 ай бұрын
15:28 leading upto 16:48 i think what i wanted to ask is interface in composition.
@yash1152
@yash1152 8 ай бұрын
16:46
@andrewgjkgjk
@andrewgjkgjk 5 ай бұрын
@interface was one of the reasons I loved Obj-C in the 90s.
@RoccoWocco
@RoccoWocco 6 ай бұрын
C# also has default implementations in Interfaces just like Rust. It's indeed nice, but honestly do not end up using it often.
@rumplstiltztinkerstein
@rumplstiltztinkerstein Жыл бұрын
Now I understand why Rust traits work in such a way. It has the advantages suggested in this video, without the disadvantages that comes from inheritance.
@ThePrimeTimeagen
@ThePrimeTimeagen Жыл бұрын
yep
@betterinbooks
@betterinbooks Жыл бұрын
trait system is so good I wish it existed everywhere else.
@rumplstiltztinkerstein
@rumplstiltztinkerstein Жыл бұрын
@@betterinbooks I agree. Once I was coding a server backend. I created the struct for the internal state that is going to be accessed by the endpoints. I then created a trait with the methods for accessing the state. For each endpoint, I created a unique trait for it with the behavior of that endpoint. The trait applies to any struct that implement the original trait type. Thanks to that, each endpoint is its own trait. We just have to implement these in the state type. Instead of one file with all the business logic, I was able to divide each into its own trait. Extremely easy to scale. Loved it so much. Using that structure, we could have several people working and pushing to the same repository at the same time. Each developer needs to simply work on their trait.
@_nickthered
@_nickthered 21 күн бұрын
I cannot satte how important single responsibilities principle and encapsulation are very important to avoiding common mistakes and misues of inheritance.
@tr4x1ymus
@tr4x1ymus 4 ай бұрын
i remember xna, and it will stay there, in my memories, haunting me as i sleep.
@glenndeprey3906
@glenndeprey3906 3 ай бұрын
I wonder, in unreal engine the base classes have been inherited like 20 times before u get your actual base class. Is this is a issue?
@michaellatta
@michaellatta Ай бұрын
Inheritance is more about modeling the domain and that subclasses ARE an instance of the superclass. Composition is about HAVING something. Those that argue they are solving the same problem are mistaken. Interfaces/traits are for a shared set of behavior with different implementation. They are all different and have their place. The problem is when a language forces a developer to only use one.
@matyasrakosi3100
@matyasrakosi3100 15 күн бұрын
is the screen tearing part of Prime's video, or did my system fuck up again? it seems like every video he watches has tearing, but i don't see it in other videos i watch and it's driving me mad
Dear Functional Bros | Prime Reacts
26:03
ThePrimeTime
Рет қаралды 174 М.
The Flaws of Inheritance
10:01
CodeAesthetic
Рет қаралды 874 М.
didn't want to let me in #tiktok
00:20
Анастасия Тарасова
Рет қаралды 11 МЛН
The Noodle Stamp Secret 😱 #shorts
00:30
Mr DegrEE
Рет қаралды 34 МЛН
Brain F**k in 100 Seconds | Prime Reacts:
6:28
ThePrimeTime
Рет қаралды 218 М.
Dear ThePrimeagen, You Are Wrong | Prime Reacts
22:14
ThePrimeTime
Рет қаралды 87 М.
Why You Should AVOID Linked Lists
14:12
ThePrimeTime
Рет қаралды 266 М.
Is Stack OverFlow Evil? | Prime Reacts
38:13
ThePrimeTime
Рет қаралды 189 М.
Carmack Doesn't Like Vim | Prime Reacts
26:52
ThePrimeTime
Рет қаралды 367 М.
1 TRILLION Messages on Discord | Prime Reacts
28:01
ThePrimeTime
Рет қаралды 150 М.
The Only Database Abstraction You Need | Prime Reacts
21:42
ThePrimeTime
Рет қаралды 177 М.
Serverless Was A Mistake | Prime Reacts
13:40
ThePrimeTime
Рет қаралды 202 М.
The Truth About HTMX | Prime Reacts
49:56
ThePrimeTime
Рет қаралды 331 М.
So You Think You Know Git - FOSDEM 2024
47:00
GitButler
Рет қаралды 919 М.
Готовый миниПК от Intel (но от китайцев)
36:25
Ремонтяш
Рет қаралды 358 М.
Apple. 10 Интересных Фактов
24:26
Dameoz
Рет қаралды 43 М.
Apple Event - May 7
38:32
Apple
Рет қаралды 6 МЛН
Купите ЭТОТ БЮДЖЕТНИК вместо флагманов от Samsung, Xiaomi и Apple!
13:03
Thebox - о технике и гаджетах
Рет қаралды 65 М.
Вы поможете украсть ваш iPhone
0:56
Romancev768
Рет қаралды 578 М.