Let's Talk - Validating Formal Arguments - No Thank you!

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
sometimes i catch myself wondering why we validate formal arguments inside all our methods and what will happen if he didn't what would happen if he changed our assumptions assumption assumptions assumptions [Music] what's up youtube welcome to this next video on let's talk today we're talking about validating or not validating formal arguments so as you could probably imagine i'm for not validating which basically means most of the community and guidances of this book is let me show you the book framework design guidelines it's a very famous book very popular book i actually like the book there's lots of guidelines in here that i do subscribe to or subscribe to but there you want some other guidelines that i don't know and this is the case the guidelines themselves are kind of vague the comments in some other cases are i'll describe what the book the way the format is of this book but it's very interesting but there are the reason i make this video is two four one everything i do every video i make i'm talking to you about my experiences i'm never kind of regurgitating what somebody else is saying i'm never regulating what the the going the trends are the you know the technology kind of chasing technology i'm never doing that my for this channel and for the videos i make is to impart my experience and knowledge to people who are interested in hearing that and learning it and learning from it and going down that path and then eventually coming up with their own discoveries if you will you know things that i'm doing which are different from the general trends this book the statement here oops i didn't lose the i have a bookmark here to for the spot now this book is organized in a very nice manner that is there's a guideline so the authors of the book come up these guidelines because they've been discussed by many people as they come up with these guidelines now once they come with the guideline they take that guideline and they have others in microsoft namely the from the dark knight framework team from the pcl team from the c-sharp team and so on an opportunity to comment give their view their perspective of those guidelines so here's a guideline and then different people have a different take on it some people have nothing to say so not everyone says everything or for every guideline some people be will be extra vocal about it some people will completely disagree with the guideline and so on so there are variations to the theme if you will but that also goes to show that not every guideline makes sense to everyone and specifically not for everything okay now in this the the topic or the headline here the sub chapter or the sub what do we call it here but here is called validating arguments it's 5.8.2 for those who are have the book and it says here and i can't actually read without my reading glasses really too well so i might struggle a bit rigorous checks on arguments passed to members are crucial elements of modern reusable libraries all the argument checks may have a slight [Music] may also have a slight impact on performance end users are in general willing to pay the price for the benefit of better error reporting for the benefit of better error reporting let's make a note of that better whatever that means better error reporting okay which becomes possible if arguments are validated as high up on the call stack as possible so they're willing to give up the performance set for the benefit of better error reporting and that becomes possible the higher up you validate at the higher up on the call stack to be validated right that's what the guideline itself is saying now there's only one comment from a person called rico mariani from the.net framework dr runtime team so his perspective is very different from let's say yours and mine he is part of the dot net on time team their focus is purely on performance they don't really care to add any titbits of niceness for the sake of losing some performance all right so their focus is very different but nonetheless this is what rico mariani says the key words for me here are high on the call stack and essentially what he's saying is the lower down the call stack you go one it becomes relevant and two the cost becomes more and more and to do the validations the cost becomes more and more all right oops i hope that didn't cause a big explosion on the mic here sound okay so for better error reporting and high up on the call stack so when we build our applications is our system higher up on the call stack then let's say dotnet runtime and dotnet framework the bcl yes of course i mean our application is sitting on top of the dotnet framework.net runtime so any class library.net framework has given us or any runtime features our application sitting on the top of that so so it means it's better than our applications do the validations than the runtime or the even frameworks frameworks are things like mvc web api dot net core right asp.net baseband core these are all frameworks it's better that our applications do the validations than these lower down in the call chain right however you will find in the dotnet source code especially the newer source code that they've open sourced in the dot net asp.net core code and everything else they are validating every argument to every method in every class do you see a problem with that do you want do you do this practice do you follow this practice too have you ever wondered why it's done or do you ever feel like you don't want to be doing this and maybe you got a reason for a batteries are not like i don't like it but more to do it like there's a real reason for why you may not want to to be doing this well i'm that's what i'm going to talk about today but in case you have your own please let me know in the comments as well i'd be interested to hear you know your perspective on these uh if things are having you the wrong way right i mean what happens with me that i follow the practice and then it starts to it's not quite working that's because i question everything that doesn't mean i question i don't ask you the question i'm following a practice it seems like a good idea it seems like everyone's doing it i follow it and then i start to question it like wow i'm not sure that that's the right way to do it or that's even working or assuming what the effort and so on so forth you're questioning what you're doing because it's not adding or it's not giving you the value it proposed said it would and there's no real benefit maybe they didn't say anything about values or benefits if you're doing it and you have to question that saying why am i doing this like what's it getting me why am i wasting all this time and effort behind something so the common another call you'll hear me say this frequently i certainly my team here's me say this common practice is not common sense just because a community happens to be doing this or has agreed to do a certain platform you know perform a certain practice doesn't make it commonsensical but it doesn't make it right all you can say about a common practice that it is a practice that is practiced commonly but that's right wrong the best or not if there's no indication of that you cannot correlate a common practice to be the best way to do something or the right way to do something just because our ancestors whether it's you know cultural or religious practices and i'm sure you have some of those in your head already thinking oh my gosh yeah in my family or my country or whatever school company we follow certain practices that seem to be kind of like why why are we doing that right so they've been going on for eons and we consider them to be the norm or that's the way to do it or that's how things are done around here or whatever the case may be but you must question these practices because if they're not adding any value or if there's a better way to do something then you need to address that was it isaac asimov okay it's probably not there's some conflict with who said it okay but i'm just going to use it as isaac asimov's court he says something like our assumptions are our windows to the world our assumptions are our windows onto the world if our assumptions are sorry our assumptions are our windows under the world so wipe them or clean them often or else no light will fall in or something to that effect so i don't care who said it that the idea is really cool because you we make assumptions even when we write code we make assumptions but every once in a while you need to question those assumptions which is you know scrub them wipe them wipe these windows because if no light comes in what it's really saying is if you don't constantly question what it is you're doing you can't improve and you maybe there's a new technique there's new technology there's a new tool cricket something that is a better way to do what you've been doing for all these years or decades whatever it is so if you don't scrub these windows if you don't give yourself the opportunity to look at new trends or new techniques or new paradigms you will never let the right comment which means basically you'll never learn right so i think that's the reason one of the reasons that i also feel like i question things because just because it's been done and the quote the difference is that i'm not questioning off the plan i will do it i'll see for myself how i feel i'll try and either achieve or get the benefits that people are saying that there's certain practices it gives you and if not i'll start to wonder what else does it give me or is it even worth the time and effort and then i start the question so this practice so i'm going around the bush but i'm trying to set the stage here this is an extremely common practice i see this especially in open source source code cover projects in companies because again they're seeing the same practice so everyone's just following along like monkey see monkey do [Music] we're all monkeys so much so but all i'm trying to say is we sometimes just follow things blindly right so but my problem i think there are a few culprits to this i'll bring that up later but for now i'm just trying to set the stage here going back to the statement in the book is better error reporting and hired up on the call stack my solution to these problems happens to be exactly that better error reporting which i actually get is proven to be better it's not like just a statement you know in our grandiose statement and it's higher up on the call stack it truly is in fact as high as you can possibly get on the call side you cannot get any higher than that so what i am doing in fact in many ways is following this guideline however for the most part it seems like i'm not all right so let me set the stage and i'll show you what i do i have one slide in this uh video this talk normally i don't have in the let's talk series i don't have videos uh slides that you know i want to spend time on the screen but i've got this one slide that's going to help me give you the visual i'll walk you through this one slide and from that point forward then i can just talk and i'll probably show you the yeah i'll show you the sum it up here okay while i'm talking if that makes sense okay so let's switch over to the so i have the saying that i'm a slightly certain enemy if you lock the front door and you lock the back door you're safe in the house the front door is inputs coming in from the front like the ui or some other you know you've got an api systems from api the back door are things like your database the services you might be calling to get or receive data from these other external services config file system stuff like that this is all the back door right so if you lock the front door and you lock the back door you're safe in the house so there's no boogie man in the house there's no boogie band under the bed there's no boogie man in the closet there's no boogie man behind the door wherever else these boogeymen happen to hide there is no boogeyman in the house and this statement is going to become pretty you know prominent now moving forward i'm going to show you what i mean by locking the front door and locking the back door so we are kind of on the same page here so for me i don't know if you guys have noticed this before or i've watched a video but i've mentioned something for me this is the system the ui is not considered part of the system but the domain layer is the system i protect the system with my life this system is the highest priority in my in terms of testing in terms of whatever i protect the system this is a black box nobody knows the inside of the black box you can't see the stuff on the inside of the black box because there's only one public class in this entire system and that's typically my domain facade which is up here and that's it everything else is internal you don't actually see it because details just the the data transfer objects these are immutable and they go in and out of our system they generally shuttle data back and forth those are not obviously they have to be public my exceptions are public but no behavior classes are visible to the outside however this that's a slightly different topic here let's just look at this now even though i'm showing you these red lines here this would be conceptually my domain facade but the validations are not actually done here it's not relevant to this talk so just don't get caught up in it but for those who know my design i'm just going to kind of confirm that or clearly provide some clarification this validation will reside in the managers yes these are the managers they'll decide here but i'm just showing it up here as the front door because the domain for that does absolutely nothing so it's not like it's doing anything there's no logic there's no nothing here so it doesn't matter whether i show it here or i show it here but in if you would actually implement it the implementation of the locking the front door is happening over here but it appears like it's happening over here but there's nothing actually no code over here itself it's like a pass through all right having said that that's your front door so any ui api whatever else you're coming in from the system the regular through your api that's your front door so if you lock the front door and then this is the back door your data access your external services the file system the config provider the config provider is also some people think that a secondary provider is you know like a big no big deal to me is a big deal because the config provider is giving you all this data this data you rely on right the same configuration parameters and it's the in my case the config provider provides you with strongly typed data it validates every piece of information that's coming into the system from the file from the config file it type cast them to strongly typed things with like date times inch double that sort of thing if it doesn't like anything it throws an exception it does not allow any crap any garbage coming into your system but that's the same for all the other things at the back door if you understand this concept then you can understand that if the validations and there's cleanup happening in the front door as well so the front and back doors are doing validation and cleanup what is cleanup cleanup is things like so in my systems a string generally in c sharpest string has three possible states right you've got a null empty string and a value string a string let's assume if there's a string that's not an empty string or spaces it's a valid string right and this null so there's three states in my systems there are only two states to a string a string is either null or smaller string there's no empty string empty strings are just not possible in my system it's not allowed you cannot have a null or empty check in my system you can have a null check you cannot have another md check you can't have a length equals zero check it's just not first of all it's not required and the moment you use it it's saying that something is a mess here right either you're imagining something or you let the boogeyman in the fact that you have to do a empty check in the system and within the system within the confines of that you know inside the system somebody has let the boogeyman in right so that needs to be addressed you can't have that happening in the system and so you certainly can't have no empty checks or not length equal zero checks so by cleanup i mean let's say there's a scenario where in a detail a certain property is nullable the ui return sent that to you as an empty string or send it to you with a string just a bunch of padded zeros sorry spaces i mean zeros whatever when you clean it up you end up with an empty string you clean up the empty string it becomes a null and what you ended up doing in the front door is you sent a null in so it's been cleaned up on that null is valid therefore has come through if the knowledge itself was not valid for that property or that dto whatever the parameter is there would be an exception right the front door basically shows an exception if it doesn't like anything it throws an exception now the other kind of caveat that's not pertinent to this conversation is that when you throw an exception let's say i've got a method that has an argument that has let's say five arguments or a dj that has you know five or ten properties when i do the validation for these arguments or properties i accumulate all of the errors and then throw one exception right it's not like one error per property or per argument and that just becomes tedious so it's incumbent upon you when you do the validation at the front door you validate all of the input accumulate all of the problems with all of the different arguments parameters whatever you know you're dealing with and throw one exception that very clearly details every single issue scenario and possible fixes to these right it's not okay to throw 10 exceptions because you're validating 10 arguments so but that's besides the point what i'm saying is at the front door you're validating and cleaning up so if a null is allowed for a certain property and the system of front-line sender empty string or a bunch of spaces clean it up it ends up with an empty string and empty string equates to a null send the null in because apparently and all is acceptable to your system just cleaning up and validating both at the front door in the background all right so let's pretend all of us are little classes in the system we're talking about here within the confines of the the blocked front door and lock back doors so we're all safe in the house which means you and i can talk without any concern for the data that i send you you don't have to worry about what i send you because you can be assured that there's no boogeyman hiding anywhere in the house and anything i send you has to be valid you can just assume it's valid right but the front door and all the back door these are the these are the highest up in the call stack that is the point of entry into your system it doesn't get any higher than that so by doing this you are actually supporting this guideline better than pretty much anyone else else seems to be doing even they're following the guide now so they think they find the guideline that is you are doing this validation higher up on the call stack and because it's coming into the entry point of a system you can report on errors much better because one you have the input to your system that causes the problem you can very easily reproduce the problems when you throw an exception maybe you're logging an exception in the logs you'll have the input data as well as the exception so anytime you want to reproduce a problem just provide the same input and the system is going to blow up so it has many benefits to that but also fact that the internal system is much cleaner the there's much much less data in every method this clutter of doing all the validations and every method for every argument it just doesn't make sense to me right that's something that is the result of either misunderstanding the guideline or coming up with their own thing well you know if one is good then two must be better and 10 must be fantastic or some something to that nature where people think more is even better right as i said the dot net framework team a whole lot of open source projects they all validate every single argument now they have libraries to assist them they even have some cases attributes to nitrogen slightly definitely the dotnet the c sharp eight attributes are slightly different so let's not confuse them but there are some some attributes i think by resharper or uh others that cannot do the same thing so what i'm really talking about is this the idea that you even have to validate it's not about the code you write over the user attribute versus the code you write the idea that you even have to validate deeper in the gospel system beyond that front door and back door it itself is the problem right it's not with that right one line of code or two lines of code whether they use an open source library or some magic happens at compile time you know through uh attribute oriented programming but just injects code that you never wrote i'm not talking about that i'm talking about just generally if it's happening if you're doing it that itself is wrong like the thought that you actually want to do that or is happening automatically it doesn't matter it's happening that's that's wrong let's play a little game a scenario i'll present a scenario and then we'll see how i think about this you understand my where i'm coming from i'm a class with the method you're a class for the method your signature my signature says it needs whatever it needs a string all right one of those arguments is a string i want to use your method so i call it now i send in null string you ask for a string i'm sending you another string now the string is valid in that sense it's a reference type so it can be null you get the string you're not doing any validations as in as per our this discussion you're not doing any validation not a mind for that matter but you're not doing it either so you get a null string you start to operate on it what do you get exactly not a reference exception okay so then what so i get a null reference exception and i say hey like dude why are you throwing this exception and you're saying what buyer beware caveat emptor call us data call us problem so basically you're going to just throw it back in my face saying give me you send me bad data too bad it's your issue go fix it there's nothing i'm going to do right that's what your response needs to be generally it's not that response i'm saying it needs to be that response the way you want to think about it is buyer's data sorry call us data call us problem or buyer beware meaning i'm the buyer i'm buying your product it's my issue if your product doesn't work not the other way around you follow okay so fine okay so i look at it and same thing okay man so my smile is here great now i'm looking at the data send you oh yeah this this string there's no i never did anything in my method here it's not like i created that string on my own it was given to me by my caller go catch him or her and throw that back on her face or his face and say same thing you told me call us data call this problem right and if we all do this in the entire call chain we keep saying it's not my problem because i'm not going to try and address like just like you're saying you're not going to try and address this issue it's not your problem it is not your problem you didn't say i wanted a null you said i want a string cool then you got a string but it was a null so it was my issue i push it back upstream it goes up stream upstream where does it go to the front door exactly so which basically means now here's other issues or something i see very very frequently happening is the flip side of this thought process because you validate every argument that's the flip side when you see an issue on your system and i say hey dude like why are you throwing an exception you say oh let me check oh yeah you know i need to fix that how do you fix that cool i just put a null check that's the problem right when when we end up trying to fix the problem that you are seeing the problem in your classes that's method you're treating the symptom not treating the cause you're treating the symptom and this applies not just for this this talk as this whole idea of validity argument this applies anywhere you see a problem in your system don't fix it at the site you see the problem understand why this site has this problem like you know like in the previous discussion you're saying hey shiv i never asked you to send me a null but if you send me a null that's your issue right you said it back to me you're not trying to fix it on your own you're basically saying i'm not going to fix that issue i'm not going to deal with crap anyway so i'm going to fix it you fix it i look at the data saying well it's not my data either so i need to send it upstream if it was my data then i need to fix it if i created that data on my in within my method and i sent it to you i would have to fix my method the root cause would be my method but in this case if it's not something i created i send it upstream and eventually everyone in the system if you all play this game it's going to end up at the front door which means something random is at the front door if you did your proper validation and or cleanup at the front door you wouldn't have this problem make sense so there are some stipulations if you will to this this thing right it's difficult for me to tell you exactly what because i i have so many of these weird practices that i you know when i question things and i do things differently you know a common practice is not common sense i can't tell all the dependencies so one of the things is that my details if you remember if you've seen my uh the video before last i think it is on on uh behavior classes versus details right the details are immutable the details are the only things that move around the system if you were to look at my system from the top i've got all these behavior classes and i got all these details the behavior classes don't move they're not going anywhere nobody's passing behavior classes around what's being passed is details so details are going from the front and here and there so we're all passing details around the place right so i'm a behavior class and you're a behavior class i'm not passing myself to you i'm passing you some data through this dto these details came in from the front doors and the back doors these details are immutable once they've been cleaned up and validated they become immutable details that come into the system so which means nothing has no one ever has to be worried about any data being changed and nonetheless you know even if you didn't change the data the fact that we trust we trust each other in the system that every class by vm in every class trusts other classes in the systems there's no mistrust so in this case the problem went back up to the front door if you used sql server for databases and there's a char field car field i've heard people saying car field because what i used to drive a woman back and stuff like that this is a char feeling i think in america they say car field but understand character so you should say careful well i guess they do say kara i say car [Music] i don't know whatever it is char field it's a fixed line field for the most part when you receive this data from the database it comes back to you filled with spaces if it's like even if you put only one space and it comes back to your spaces or let's say the field is you know 10 spaces long and you have the the data shiv in there it's going to come back to you with padded with spaces you you don't know what i'm getting at so if that data comes into your system it's incumbent upon your like this data access thing that i showed you here earlier that's locking the back door to clean that up it can't allow that data to come with padded with you know spaces at the end of it it starts it has to be cleaned up right so the benefit of cleaning up in one place first of all it's very easy to know where you're going to clean up right it's all happening in one place i don't mean by one place in one class what i mean is conceptually if you look at the system it's happening at the boundaries anything that's exposed to the outside is happening there validation is cleaned up so you don't have to wonder where is it happening it is happening here or there right in the two ends of the extremities or the boundaries of the system this is where the cleanup happens that prevents what i've seen in the past is because the streaming issues there right there the fact that the sql server databases other databases send data padded with the spaces that that removing or removal of padding is in 15 different places in the system because instead of saying let's do this in one place we end up doing this in 15 different places where we use it and so that's the repetition of that logic unnecessary doesn't make sense and i at this point don't even know if it's truly cleaned up or not as in are you doing it unnecessarily just in case don't know maybe so anyway so there are many many downsides to this unnecessary validations happening all over the system besides the clutter is the the the confusion that occurs as in people's mind like do i need to do it is it there do we need to do it anymore do i need to do it at this stage are you so deep in the cups of the system am i sure i need to clean up the data there well just do it just in case right so so that's one of those issues that you that i see with validations all over the place what about the culprits what here's my take on it okay again this is the usual suspects again the culprit testing testing in isolation will almost force you to implement validation for every classes every method why because you are testing at the class level and you're testing that one method so to make sure your class is robust you have to be able to test it with the different bad scenarios and has to be able to handle it so you need to do the validation for that class at the class level if you didn't do class level testing or testing in isolation like i don't i don't do i test the entire system so i test that black box or this green box as i showed you earlier from the outside i mean the public service i don't need to know what's inside that system but i'm not interested in testing all the different parts and pieces so i can't even get bad data in past the front door or the back door there's no way for me to get that into the front door back door sag there's no way for me to even validate the cloud the methods at the class level right and so i guess that's kind of like the other thing i'm saying i was saying earlier was there are all these inter i would say indeed dependencies but one biggest the other kind of thing in my designs where i get all these benefits because of all these other things they seem to kind of snowball into this huge benefit and it's difficult to tell what practices that i follow give me some of these benefits so now that i'm thinking about it i'm thinking well yeah of course because i do acceptance level testing i have no need for class level testing and testing isolation and so then i don't see the point of it but nonetheless even if i wanted to i can't do it because i can never send bad data past the front door it can't hit some glass you know uh three four levels deep into the cuts of the system but if you take the class by itself oh yeah then you can access this public you know methods and you can test it but it's like an invalid valid test like wow i can never do that on my own i can't actually do that from the outside so why am i testing it right but i think that's the culprit this idea that you want to test classes in isolation and then we treat the class as if this one class is going to rule the world at some point so let's make it robust right because this one class is completely standalone and it can do pretty much anything it needs to do all by itself and my classes are not like that there are sort of lower level classes in in the scheme of a totem pole there are classes that higher up in the totem pole that are clustered lower in the total mode right they each have a place in that the totem pole hierarchy not hierarchy but levels i guess also conforms to levels of obsession so there are very clear distinctions between my classes there's no confusion as to what type of role that class is playing in the world and it's not going to start really ruling the world just because it's so low on the totem pole anyway going off the topic so in conclusion what i'd like to say is this i want to just make this clear so people understand where i'm coming from but also the the purpose of these videos are not purpose but why i make these videos right i don't make these videos where i'm trying to make a video i'm certainly trying to make a video every week there's no question about that but i'm not just throwing crap at you guys these videos every one of these videos are i'm very very passionate about these topics i wouldn't be making these videos if i weren't passionate about these topics every one of these makes a lot of has a lot of meaning to me and certainly for the people i work with you know they're they're hearing this stuff every single day right it's like somebody others gonna say something or show me some code and i'm gonna start spewing out all these things to me it's native to me it's kind of second nature but i want to share this because i think these are really important ideas and concepts and i want you guys to be able to distinguish between me just producing a video but i learned something i just learned something and i want to be the first one to produce a video on youtube or i'm not doing that i'm not chasing some new technology that comes out and be the first to write about it or you know make a video about it that's not me right i'm about foundational stuff i'm about the grassroots if you have a solid foundation you can build a skyscraper if you don't have a solid foundation you're going nowhere i don't care what technology you're reading about what interview question you're trying to you know helps uh answer it makes no difference to me if you cannot answer these foundational things if you cannot if you don't have a good grasp of the foundational understanding of software engineering it doesn't matter so for me i'm passionate about these things because some of these are like practices conventions that everyone else follows and i don't seem to understand why because i have i've been reformed i tried it for years sometimes you know over two three projects maybe it's not quite working i start to question it wondering why and why are we even doing this stuff what else could i do what's the benefit is there a benefit but i still have a problem how do i solve that problem so for me it's a process and as a result of this process it's not based on a belief system if that makes sense i distinguish beliefs systems from let's say proven fact if you will for me this works this is proven to me it works you cannot argue with me about it because i have done this i can prove it and people on my team who didn't believe this you know they believed in the conventional practice common practice we will have been made converse by looking at how the system be is so if you haven't certainly you should try it yourselves but let me say this if you can prove to me that you have another or a better way that's truly you know a better way i switch in a second because it's not i'm not married to this stuff i don't care what it is i'm out to get the best benefit of what i can i'm not necessarily out to follow practice you know common practice i need to get what i need to get i need to get that benefit if there's a procedure process technique that you are following that you think is far superior or has a benefits over what i'm saying or doing i'll look at it and if that convinces me i'm on it i mean in a second i have switched languages i switched careers i switched diets overnight and literally overnight people who know me will tell you overnight i can go from being non-vegetarian to vegetarian overnight it doesn't take me any time at all if there's a benefit the key is you have to prove i have to see for myself like there's a benefit it's not based on a belief it's not based on a desire i want to do it like this so now i'm going to make a way to find a way to to you know make that happen or prove to myself and you why this is better to me it doesn't matter whether you follow it along i'm sharing with the hope that you guys learn from my experiences if you don't want to learn if you don't think this is okay that's fine with me i'm not it doesn't matter to me one bit i'll still continue with doing this practice because for me this still works okay anyway there's nothing going on i just want to make sure that people don't think i'm just pushing videos out just to make something it's been long enough i hope you guys have enjoyed this video if you have please give me a thumbs up please subscribe and i'll see you next time
Info
Channel: Shiv Kumar
Views: 1,304
Rating: undefined out of 5
Keywords: C#, .NET, OOD, OOP, Programming With Intent, .NET Core, Class Design, Class, Design, Seperation of concerns, State, Stateless, Statelesness, Statefull, Properties, Methods, Behavior, Data Transfer Object, DTOs, Value Objects, Immutable Classes, Records, Composition, Prefer Composition over inheritance, White box reuse, Black box reuse, Lock the front door, Lock the back door, Validation, validating formal arguments
Id: 2BJ11M9rrzY
Channel Id: undefined
Length: 39min 8sec (2348 seconds)
Published: Sun Dec 20 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.