Coding Blocks - Clean Architecture – Make Your Architecture Scream

Episode Date: February 19, 2018

Michael can't tell higher from lower, Allen puts his views where he wants them, and Joe snaps it to a Slim Jim as we discuss how to make our architectures scream while discussing Robert C. Martin's Cl...ean Architecture.

Transcript
Discussion (0)
Starting point is 00:00:00 you're listening to coding blocks episode 75 subscribe to us and leave us a review on itunes stitcher and more using your favorite podcast app and check us out at codingbox.net where you can find show notes examples discussion and a lot more send your feedback questions and rants to comments at codingblocks.net follow us on twitter at codingblocks or head to www.codingblocks.net and find all our social links there at the top of the page. Blast from the past. I was wondering if you were going to do that again. Yeah, yeah.
Starting point is 00:00:28 Because we hadn't heard that in a while. It's been a while. So with that, I'm Alan Underwood. I'm Joe Zach. And I'm Michael Outlaw. A quick question for all of you trailblazing freelancers. If you could reclaim up to 192 hours a year of your precious time, would you? Our friends at FreshBooks who make ridiculously
Starting point is 00:00:46 easy to use cloud accounting software for freelancers are the architects behind this question, and for good reason. By simplifying tasks like invoicing, tracking expenses, and getting paid online, FreshBooks has drastically reduced the time it takes for over 5 million people to deal with their paperwork. If that's not enough incentive, the FreshBooks platform has been built from the ground up. They've taken simplicity and speed to an entirely new level and added powerful new features. Oh, and if you're doing the math, 192 hours works out to two working days per month.
Starting point is 00:01:20 But hold on a second. Let's make this real. Two working days per month doesn't sound right that's 24 working days a year that's almost five full weeks that's bringing this that's that's like the month of february right that's like way more vacation time that i take off a year 24 days is incredible yeah okay i mean if if you really wanted to be a mathematician about it. But two working days a month, it doesn't spell it out. The point is 192 hours is a lot. It is.
Starting point is 00:01:54 All right. So when tax time does roll around, you'll find tidy summaries of your expense reports, your invoice details, your sales tax summaries, and a lot more. If you're a freelancer listening to this and not using FreshBooks yet, now would be a good time to try it. FreshBooks is offering a 30-day unrestricted free trial to our listeners. To claim it, just go to freshbooks.com slash coding, that's C-O-D-I-N-G, and enter coding blocks in the How Did You Hear About Us section. All right, so before we get into the show, which this one's going to be about screaming architecture and the various different business rules and entities involved in there, first
Starting point is 00:02:36 we like to go over what we very much appreciate, and that is the reviews that we've gotten. Yep, and so for this episode, from iTunes, we have, first of all, these are gonna be some great names. So let me just go ahead and give you that. Prepare yourself for these amazing names. Tillman 32, Satisfied Photo Printer, Cyclomatic Double Complexity, and Portuguesey. Those are awesome. And apparently I have Stitcher.
Starting point is 00:03:08 I didn't even know that. So I've got Styx, Edward Dunn, and Rosengren. Yep. Very nice. Yes. Thank you all. Go ahead. Were you about to do one?
Starting point is 00:03:20 I forgot I put this thing in here. Well, I was going to mention your thing here. So we had a previous tip of the week um someone brought to our attention that it's uh sql sql server management studio 2017 only and you want to explain that alan i forget exactly what it was yeah so i in the last episode's tip of the week i said hey if you open up the output view and you go and you show object explorer and that drop down then it would show you all the cool stuff that's happening when you expand nodes in the left side for navigating, you know, your databases, your tables, all that kind of stuff.
Starting point is 00:03:51 Well, and now I can't remember who it was, man, that's terrible. At any rate, it was brought up that it wasn't working. And what it boils down to is he had SSMS for 2015 installed. Apparently it did not work there. So in order for this tip to work, install SQL Server Management Studio 2017. And the cool part is it's free. So you can go download it from Microsoft. And they are really good about their management studio products being
Starting point is 00:04:25 backward compatible. So chances are you can download that thing and get all the cool new features and it'll still work with, you know, heaven forbid you're still working on SQL server, you know, 2008 or something, but you know, or I don't even, was there a 2000, I don't even remember what the versions are anymore, but yeah, it'll probably still work with all that stuff. So, you know, there you go. Yeah. Big thanks to Jerry for pointing that out for us. Jerry. Thank you, man.
Starting point is 00:04:51 Yep. Hey, and I've got a talk coming up here at Orlando code camp and that's on March 17th. So if you are in the central Florida area or feel like making a drive, you should stop by, say hi, go to my talk, throw stuff. I did a little preview last week, and nothing bad happened. So I'm sure, knock on wood, everything's going to be fine coming up. Is that the measurement of success, if nothing bad happens?
Starting point is 00:05:16 Yeah, not falling over. I left my laptop charger there. Anyway. That sounds like something bad. It was a whole big shebang. That's a $70 mistake. I know, I know. And I got it back back i got it back after i bought another one well now you got it so bonus yes yep that's true that's true hey um also speaking of bonus uh our bud jason from unity 3d college is launching his
Starting point is 00:05:40 master course and he's selling selling tickets from the February 19th to Sunday the 25th. And then he's going to start the course. And if you've ever watched any, if you're interested in like Unity game programming type stuff, and if you've ever watched any videos on YouTube, you've probably seen some of his videos. He puts out excellent videos.
Starting point is 00:05:58 They're really popular. I've watched a few, like not even realizing it was him. And they're really awesome. And we're going to be uh giving away uh doing a little giveaway here on the mailing list so if you're not on the mailing list and you're interested in this giveaway or other giveaways you should sign up for it because we're going to be doing this real soon so basically right after this episode launches we're going to blast that out so if you're interested make sure you are uh on that list and
Starting point is 00:06:19 um checking your email because that's going to go quickly and then uh we're going to have jet brains thing coming up right afterwards. So good time to join the mailing list. Hey, yeah, I was going to add to that. Like if you're not already part of the mailing list, you really should join up because we pretty much only use it to send out, to give out stuff. Yeah, that's pretty much it.
Starting point is 00:06:37 Hey, but also I did want to point out though, you mentioned that Jason, this course isn't like, hey, sign up for a course and you get to watch some videos. This is a very highly interactive course, correct? Yeah, this is his master course, he calls it. It's very hands-on. It's not like you're buying access to a couple of Perl site videos or anything like that. This is very much more a hands-on approach where you actually kind of work and interact with him as he shows you the ropes.
Starting point is 00:07:01 And I mean, if you're interested, just go check out his videos on Unity unity 3d college we'll have a link here they're also up on youtube with fantastic material um i mean you you get to see pretty much who exactly you're going to be dealing with here and if you are interested in game development or unity uh i mean it's it's just an awesome opportunity cool hey excellent and what we got next um also hey speaking of more giveaways uh we're going to be giving away a book again on this episode so make sure you leave a comment on this episode it's going to be codingbox.net slash episode 75 or just go to the website you can find it and drop a comment on the episode um say whatever you want and we will enter you in drawing to win a book and we'll send you the physical or the ebook just uh leave a comment yep excellent and there were some excellent
Starting point is 00:07:49 comments on this previous episode on 74 as well so go up there read those i need to respond to a few of those also if you would if you're interested in plural site or anything like that and you'd like to help show out head to codingblocks.net slash resources. We have links up there for the books and Pluralsight and various different things that we like. If you want to give back by just getting what you were going to get anyways, that's a great way to do it. Also, we forget to put this
Starting point is 00:08:16 in the show every time, but if you are interested in stickers and improving the performance of your laptop or whatever you slap those things on, head to codingblocks.net slash swag and send us a self-addressed stamped envelope. Stomped envelope. You can stomp on it too. Yes.
Starting point is 00:08:31 Put some footprints on there. We will gladly take it and we will ship you out some stickers. So do that. And I think that is pretty much it, guys. All right. Let's get into the meat of the show here. And let's start by talking about the policy and level all right and i really like this chapter as i i think i say that every time but i
Starting point is 00:08:53 i liked um the idea of the word policy it's kind of funny because um i think this is a great word for kind of describing what a computer program is right it's a policy uh that you pass a bunch of inputs and you get a bunch of outputs from and that's something like that i don't really see that word very often in code i'm glad like i feel like i've seen the word code in code more than i've seen uh policy i've seen the word core for sure i've seen the word manager a lot more often but policy is a good word for you know meaning like a rule or a description of behavior i mean you probably see code in your code when you're using visual studio code
Starting point is 00:09:28 yeah as you code you know full name code in your code so you put some of your code isn't it funny we've changed that to src so that it's not code even though it is code yeah whatever um i just name all my helper classes code that's helpful exactly wrong so they they go on to point out right this this whole notion of code is basically policies for how things are supposed to work the expectations of the inputs and the outputs and most systems are made up of multiple sets of these policies, which makes a lot of sense, right? Like your application does many things. So what's a policy? Can you give me an example?
Starting point is 00:10:12 Business rules, formatting, ETL. If you've never heard of ETL, that's extract, transform, and load. So that's basically when you're moving data from one place to another and scrubbing and cleaning and all that. You know, any of those type things that go in your application. Yeah, my mind immediately went to business rules. But like formatting absolutely is like whether it's a PDF or HTML or even like if we're talking about HTML, just the way that is formatted, the various rules that we've kind of defined to make this thing look how it's supposed to look like. Those are all examples of policy. I mean, think about a UPS label that you print out that you get, right?
Starting point is 00:10:47 How that thing prints out, the size that it's got to be and all that, that's a very specific type thing. And that is part of the policy. This thing needs to adhere to a particular standard. So, yeah, all these things, they go into it. Yeah, and like we talked about in some of the previous chapters, policies that change for the same reason should be grouped into the same components and vice versa. Uh, do you remember which one that was?
Starting point is 00:11:10 Is that the, um, there's S and P in there somewhere. SRP, uh, single responsibility. CCP. Right.
Starting point is 00:11:18 Wasn't it? Close caption principle. No, I've actually got that down here. Uh, it's closed caption for people it is we should make some little note cards here ah man anyways srp is single responsibility principle and the common closure principle i believe is what it is there we go i think you're right yes so close so yeah i, it makes sense, right?
Starting point is 00:11:45 Like, you should keep things together that are supposed to change together. We've talked about that previously. But the goal that they point out here is to create an acyclic dependency graph where the items with similar policies are at the same level and the dependencies are at the edges. And that's very vague sounding. Would you agree? I think at this point in the book it is.
Starting point is 00:12:10 Yeah. In a couple chapters, which we're going to get into, it's going to start to, some of this is going to start to come together and make more sense. But when we're talking about dependencies at the edges, it's still like, what edge what edge what are we talking about and even what's the level yes we're talking about policy and level and joe asked like hey what's a policy but we haven't even described like what's a level right we're already talking about things
Starting point is 00:12:35 at the same level yep and that's the thing so right now if this is confusing it should be hopefully the details will iron that out here in a minute. So we're going to keep pressing forward and help this out. So we've talked before about kind of drawing directional graphs between dependencies. And we kind of take a different slant on that same kind of approach here. And we talk about the direction of that dependency flowing based on the level of the component and um and and this is where they actually give us a definition of what they mean by level here and they say that level is the distance from the inputs and outputs so your little class that reads input from the command line that is is that low level high level i guess that would be low level that's the low level so
Starting point is 00:13:24 basically what they talk about is when you have your low level inputs and outputs, those are the things that can change a lot, right? And so that's your lower level component. Okay. And your thing that say like does the math or does the processing, it has your business logic stuff like that, that stuff should be at a higher level because it's further from the input and output. It just does the syncing.
Starting point is 00:13:44 It passes it to someone else and that someone else is responsible for for routing it where it needs to go okay i'm glad that you guys are confused about the higher level low level too because i always get those backwards as well and in fact as you said it i was like wait a minute no the higher level is your business component no no no no no the higher level stuff would be like he mentioned command line so that's that mentions some kind of a ui right that's some kind of interaction so that would be higher level the lower level details are the policies yeah the further opposite the further the policy is from the inputs and outputs the higher the level yes so it's like it means more abstract.
Starting point is 00:14:25 Yes. Yes. You want your. Well, that's going to get really confusing. Then when we get into this upcoming chapter, because it specifically says the further you go, the higher level the software becomes. Right. And that means the more abstract, the farther it is from the actual input and output of the system i guess when i was thinking higher level i was thinking about reading from in to out you know i always have a hard time with like
Starting point is 00:14:52 binary choices like this especially not so like if you've put a not in an if statement like you've stumped me yeah i'm gonna be there for. You know what? That brings up a thing of mine that I am actually very passionate about doing. If I'm checking for a not of something, I don't do not something because like you said, it's confusing. I'll actually put equal, equal false. I know that's not necessary, but it's very explicit. Like if this is not true, then it's just, I think it calls it out easier. It's easier for people to see that equal, equal false. And it is an exclamation
Starting point is 00:15:32 at the beginning of it. I don't know how you guys feel about it, but I think it depends on the variable name and we're way off topic, but I think it depends on the variable name because if you, if you, the variable name that you're trying to not if it was like let's say you had a variable name that was is ready and you want to say is ready equal equal false that would read weird it would read better if it was if not is ready to me reads nice does that make sense so it very much depends on the name of the of the property or variable or whatever the whatever that thing is that condition that you're trying to not that's that's such it's still to me like i don't know i i'm i am hyper crazy about this like i don't i used to do not then whatever all the time and at
Starting point is 00:16:18 some point i think i overlooked one because the i don't even think it had anything to do with the naming of the variable but the the exclamation just kind of disappeared in with the flow of the text. And so I made the mistake and I'm like, never again. Right. So I don't know. It's just, I,
Starting point is 00:16:33 the way, yeah, I definitely understand where you're saying, where you're coming from with it disappearing. And so that is a strong case for going ahead and being explicit about it. But sometimes when I have ran into those situations where like, I thought that it didn't read right, then I looked at that and thought, well, that's an opportunity that, that tells me that the way I'm using this property or variable
Starting point is 00:16:55 or method doesn't read well with the code. So I should give it a better name. If it doesn't sound right when you say it. Yeah. I wanted to read, I wanted to read more grammatically correct while we were doing all this i wanted to pull back up the diagram so that i could at least you know talk about yes so the higher level is what we said the higher level is the more abstract the things that change less frequently and the lower level are the things that change could change all the time. So that that's, that's where they, they go with that.
Starting point is 00:17:27 I wanted to make sure that we were all on the same page there. Let's be the same page. I do want to mention that true and false is hard, but what's way harder is less than or greater, especially if there's an equal sign in there anywhere. And now you, you throw date diff on top and holy cow man i gotta do some examples like i gotta work on paper like okay date diff this is the right order and
Starting point is 00:17:52 this is the way the sign's going please no one ever touch it again okay so higher level then lower level would be the input correct and higher And higher level. Okay. Yeah. And we'll, and we'll dive into this a little bit more. I think it was all start making a little bit more sense here in a second. So let's press on hopefully. So actually the very next bullet point we have here, the further the policy is from the inputs and the outputs,
Starting point is 00:18:18 the higher the level. That's the very next line we have. So, so yes, the further you get away from the things that are taking data in from a UI or some sort of file system or whatever it is, the more abstract it should become. Yeah.
Starting point is 00:18:34 So your web service endpoints low. Yes. Your core library high. Yes. Well, there shouldn't be a core library. Maybe that's called code code, the code library, maybe. No, it's called code. Code.
Starting point is 00:18:46 The code library. Code helpers. Helpers code. All right. So one thing that's interesting, and this is where not having the book is going to be kind of detrimental. And we're obviously not going to copy and paste pictures out of the book because we're not trying to get any lawsuits or anything but in in the diagram that they have on here they show that the the dependencies are pointing in one direction but then the the source code dependencies go in the other direction and they wanted to call that out like they don't necessarily have to flow the same way right but how can you have say a core library that depends on
Starting point is 00:19:27 lower level things like how can you do that without uh touching those lower levels man i think this is jumping way ahead it's it's that's probably inversion of control right yeah i mean that's the answer to like everything in this book so far it really is and it's kind of frustrating and just for those out there listening that have no clue what this is like it all sounds great right like when we talk about a lot of this stuff it sounds great on paper when you say oh well just in inversion of control or dependency inversion or inject the dependencies if you've never seen it then it just doesn't make sense. And so I am going to try and put together some videos that will be like a series of, this is how you typically start an app. And if you wanted to invert that, that control flow,
Starting point is 00:20:18 this is how you do it. So I am going to put some videos together that will hopefully make a lot of this stuff make more sense because if you've never seen it it doesn't um anyways so back to this so they're saying the data flow can go one way but the source code dependencies can go the other way and that all has to do with dependency inversion and we'll talk more about that in a little while um and this is where it's kind of interesting dependencies should be decoupled from the data flow, but coupled to the level. Anybody want to talk to that? So dependencies should be decoupled from the data flow,
Starting point is 00:20:58 which means that if you've got a higher level item, like the example of our core library, it should not be coupled to those lower level items so your core library should not be touching that scanner should not be talking touching that web service there should be a level of indirection there with like an interface or some sort of you know layer boundary so your entity framework layer should know about how to talk to sql server right but the layer that's higher than that that knows how to calculate tax on an order shouldn't know or care about that dependency so data you can flow data from that entity framework layer to that higher level so that
Starting point is 00:21:53 it can do that calculation so that's the data flow but the dependency is coupled to the the sql server dependency is coupled to the same level that Entity Framework is on. Right. Data is going up, but the dependency is not coming down. Right. So picture you have an order tax calculator that is at the highest level. And let's say a level below that is the Entity Framework layer.
Starting point is 00:22:24 And so it might know how to, and realistically, there'd probably be something in between there. But the point is that whatever is getting that data, it's massaging that data and putting it into some kind of package in order to send it up to the higher level. The higher level doesn't know about that dependency. Correct. So we've got SQL Server at the bottom is sending data up to Entity Framework. It's sending data up to the calculator.
Starting point is 00:22:51 But what we are saying too is that calculator knows nothing about Entity Framework and it knows nothing about SQL Server. So that's why we're saying the data can flow one way and the dependencies don't necessarily go down that same path. And this is why I was thinking when i made the comment about there might be something in between realistically because between that entity framework layer in that calculator layer because if we were going back to like our domain driven design conversations right you might have um something in between there that's you know the entity framework layer
Starting point is 00:23:23 that level is one thing but you have another object in between it that's, you know, the entity framework layer, that level is one thing, but you have another object in between it that's actually using that data. And that might package the data up to send it to the higher level calculator to get that result. Right. And the book here has a really nice example of an encryption library. And at the kind of the top of this higher level on this this little hierarchy here we've got an actual library that does the encrypting and it's called encrypt and it has the dependency on two interfaces the character reader and the character writer and because of these interfaces you can swap in things like you know you could do it from the command line you could do it from you know in a network connection you could do all sorts of stuff
Starting point is 00:24:04 in and all sorts of stuff out you could print the encryption results to screen you could send it somewhere you can do whatever you want because the encryption library is at the same level as the character reader and the character writer and the encryption knows about the reader and the writer interfaces on the lower level lowest level, we've got a console reader and a console writer. These things that are just a deal with like a terminal window, reading an input and spitting it out to screen. And the console reader and the console writer
Starting point is 00:24:35 both are aware of those interfaces that they implement. They have to be, but they are at a different level. So what he's describing, to paint the picture again, encryption thing is at the top. That's your high-level component. In the middle, you have these interfaces that are your character readers
Starting point is 00:24:53 and writers that both the encryption component at the top knows about these two interfaces, character reader and writer, and the console reader and writer low-level components at the bottom also are aware of those interfaces.
Starting point is 00:25:09 So all that's in between the encryption layer and the console reader and writer are these interfaces for character reader and writer. And that's your abstraction. And that's how you can add this misdirection or this inversion, right? And if we were to break this up into components for some reason you know if we obviously this is a trivial example here but in this case you would have your encryption library and inside that component you would have the definition for that character reader and you'd have that definition for the character writer
Starting point is 00:25:39 and it's really important that you have that abstraction on that side of the boundary so that you can plug in any sort of readers and writers that you want to at that level. If it were reversed where you had the interfaces for the character reader and character writer in the same library as the reader and the writer, then you would be taking a dependency from encrypt onto that library. And that sounds kind of like a trivial kind of thing. But in this case, it's a very obvious decision to make i think anyone would make that decision but that's the kind of stuff that can trip you up if you're doing something where it's not as obvious and so it's really important to pay attention to that level and make sure that you're flowing in the right direction yep yeah i mean we've talked about this before. We've talked about similar kind of concepts like this. And I, I felt like this book or these chapters answered some questions that
Starting point is 00:26:34 we've, we've had before where it's like, well, where do I put some of these things? Right? Like, where do I put my interfaces? Do I put them in a, in a separate project or where do I put them in a separate project? Or where do I put some of these DTOs? Do I have a separate namespace for those? And if I understood these chapters right, the answer is that they should be next to within their level. They should be next to that same level, right? So in that example that you were just describing, Joe, the encrypt is the highest level policy.
Starting point is 00:27:12 But those interfaces for the reader and writer, they are in that same level with that. I mean, they're below it necessarily in terms of drawing, but they would be in the same thing. I don't know that. Because the encrypt would have to know how to read. It would have to be able to read something, right? So you could, I think this one's kind of open to interpretation a little bit.
Starting point is 00:27:40 So here's the thing. You could do it both ways. You could put that interface up there with that encryption component, right? You could put it up there and then it would know how to talk back and forth to these things. But the part to me that's interesting is in this little circle, right? Encrypt is pointing down to these two interfaces and the reader and writer are pointing up to those two interfaces. So in my mind, I would almost say make that a separate, I don't know, maybe a project, maybe separate project with just those interfaces defined in it.
Starting point is 00:28:17 And then both the encrypt would reference that interface project and the console reader and writers would also reference that interface project. Let me state this a different way. And let's not care about the projects for a moment. Let's say that I was going to ship you a DLL that does encryption. That DLL or JAR file or however I choose to package this thing up, this Ruby gem,
Starting point is 00:28:44 you're going to have, I'm going to need to know how to read and write data from you and back to you, right? So I'm going to supply you with like, hey, here's the interface that I expect that you are going to provide an implementation of. You're going to provide a concrete implementation of this interface. And that is what I'm going to use to do my reading
Starting point is 00:29:04 and what I'm going to use my writing back out to so they're packaged up in my same package right doesn't matter what the project is okay yeah and so that's what i'm getting at okay is that we've talked about these kind of things in the past like hey where do i put this stuff right and these chapters and it's going to come up again later when we get into dto's and we kind of hinted on it a moment ago when we talked about data flow is that it kind of says that it needs to be next to the um it needs to be within the level that it's trying to support whatever that interface or dto needs to be at that level right yeah so go ahead i was gonna say check this out so if you're trying
Starting point is 00:29:46 to decide whether something should be in the same namespace or the same component one question you can ask yourself is that are these classes at the same distance from the input and output if the answer is yes then you could put them together possibly. Then there's other considerations. So it's still a maybe, but if they're not at the same level, then your answer is no, they should be separated. But furthermore, if you can't tell if two classes are at the same level, and that's an indication that you've got levels mixed into your code and you've got business logic tied in with your inputs and outputs, and that's something that you need to take a look at. So it's an indicator of another sort of problem that you've got going on there. That's interesting. Okay, so then how would that apply then to this example with the char reader and char writer?
Starting point is 00:30:36 So if I had a single class that got input from the screen, encrypted encrypted it and spit it out all in one class that would be an area where i've got two different levels i've got input output i've got my logic right but what i'm saying is like going back to the example that he describes in the book right if if the um the encrypt functionality is the highest level of the application, what is the distance from the input and output of those interfaces? Is it the same as the encrypt, or is it closer to? Because the encrypt definitely needs to know how to use those, right? Yes, so I would say that they're at the same level as yeah i would say so i mean the picture definitely has them drawn in a hierarchy so i'm kind of questioning whether that was the intent
Starting point is 00:31:34 or not but to me that they're at the same distance they're both relying on some sort of input and output but it's completely abstracted as to how it gets in there so i don't think there's any difference between encrypt saying hey i know about a character reader or a character reader saying, Hey, I know about character reading. That to me is the same level. Well, the way I interpreted the drawing in terms of the hierarchy point of view, though, is like, it's only drawn in a hierarchy because we're trying to show the relationships between these classes and, and, you know, interfaces and functionality. But the reality is, if we were going to draw these in terms of the layers of the application, well, then we don't care about these interfaces. Those
Starting point is 00:32:14 are details that we don't care about. What we care about is the policy, which is how do we do the encryption? Encrypting is a policy. That's something something we care about and that's at the highest level and i think that character reader and character writer are strongly coupled to that like you can't have encrypt without those guys it's built in it's a dependency so those to me would be in the same component and because they're in the same component and totally bound to each other i would say they're at the same level the interfaces yeah i think they could be yeah yeah i mean i don't think there'd be anything wrong with splitting them out necessarily even though it might just create additional complexity for no real gain but i would agree all right so let's move on to the next pieces of this because i these some of these do get deep and and i i think a lot of it gets a
Starting point is 00:33:05 little bit clearer as we go on um but the key here was and the takeaway is the importance of this entire point is that the higher level components are now reusable because they've got interfaces to them they're not dependent on any concrete there's no dependencies are pointing downwards. And so these things are literally completely decoupled from everything else. So they can be plugged in anywhere. Yeah, you're basically able to, because of those interfaces, you can kind of quote, inject what you want to use in order for it to work with that higher level policy. Yep. And it says that the policies that change for the same reason or the same time
Starting point is 00:33:50 are bounded by the SRP, the single responsibility principle, or the common closure principle. So those words come up again. And this is something that's interesting, and I honestly believe it's true i was trying to think through it at the time but they say that the higher level components the ones that are sitting up there that are abstracted very well they typically change less frequently than the lower level components and if you think about it like you said some sort of calculator chances of it changing how it works is probably pretty low and so it's a safe thing to abstract out.
Starting point is 00:34:26 Yeah, I mean, let's think about if you are writing banking software, the calculation for interest hasn't really changed much in how many decades now? That is a core policy within the business that hasn't really changed a lot. But everything around it, the business that hasn't really changed a lot. But everything around it, the frameworks that are used, the tools, the languages, the operating systems, the databases, all that stuff around it has changed a lot over the years. Now we get into the part that I think...
Starting point is 00:35:04 One thing to wrap up there is that those low-level components that we were talking about all right and now we get into the part that i think go ahead oh i was just going to like one thing to wrap up there is that those low-level components though that we were talking about should be plugins to the higher level i don't know that we said that no we didn't and that's cool too because they had the whole notion of a console reader and writer for the encryption thing right you could easily plug in a web page that a couple input forms, or you could say, pull this from a database. You don't care where it's coming from as long as it meets those contracts of this is an input and this is an output. Yeah, I mean, it could be spoken voice. You could dictate it over the phone. And that's the point. That's what he means when he says that it should be
Starting point is 00:35:40 a plug-in to that higher level. Because there's that interface between the encryption policy and how it's reading and writing the data then when i said you can quote inject whatever functionality you want in there and that's how that can be a plug-in into it right so you could have it like hey you know you want your password encrypted call 1-800 will encrypt it for you and it'll read back out what you should write down in your little password journal uh hopefully you don't use that service too often i'm gonna start that service that's gonna be money that's terrible uh so this is the part this is where i really
Starting point is 00:36:19 liked where it started going into this because how many times you said the word business rules when, when you were talking about something you're working on hundreds, right? And, and I like how he breaks it down here. So I'll start it off with this one. Business rules are the rules or procedures that make or save the business money.
Starting point is 00:36:41 That's pretty cut and dry. That's a great definition. It is. And well, with an important distinction there or, or like, you know, an asterisk there,
Starting point is 00:36:52 they make or save the business money regardless of whether or not they were implemented by a computer. Yep. Yep. If they did the thing by hand, if they were running interest calculations on paper at the bank, it's going to be the same as if they had done it on a computer, right? It doesn't matter if you sold that car online or if a person walked up to you, introduced you to the car, and then had you sign on a dotted line. It's selling the car is the rule. What has to happen for selling that car, your business rules. And so here's where it's interesting.
Starting point is 00:37:26 So they talk about critical business rules. Again, this is with or without a computer. These are the ones when they call them critical business rules, they're critical to the business, right? Like a bank interest, it matters. You know, loan origination fees, that kind of stuff, it matters to the bank. That is part of their core business. So critical business data is data that would exist even if there weren't automated systems.
Starting point is 00:37:56 You ever work somewhere with paper? Not in a while. I used to. It's been a while. Yeah, not in a while. Yeah, I was trying to think of a really good example of that. When you mentioned paper, I remember way back when people filing their taxes by paper. Oh, man. Yeah.
Starting point is 00:38:16 Filling out the 1040 easy. That data had to exist. It didn't matter if you had a computer to enter it. Man, it reminds me. One of my good friends vp over at ups just retired after 42 years it was a long time one of the guys that got up there and was talking about you know way back in the day when they worked together the way he kind of got started was they worked in this area at ups and everything was literally hand ledgers right like they go in there
Starting point is 00:38:43 and they'd fill things in and if there was mistake, they go back and erase it and they fill it in. And one of the things that this guy did was he was like, man, we can automate this stuff, right? So he took those business rules that they were literally handwriting for everything, inventory, accounting, all that stuff, and moved it into a computer. The business rule didn't change. Just the efficiency and the speed at which it happened was what was different and this is where this is where it ties the two together right critical business rules and data are tightly bound makes sense and they're a good space for an object that we've heard about in domain driven design although it means something slightly different here called an entity yeah sound familiar like uh triple d you know here's the thing and and i
Starting point is 00:39:29 want to preface this a little bit domain driven design has very opinionated wording about how they reference some of these things and the meanings are a little bit different here this is more about how you separate your components in your system so that you have a clean architecture that can be maintained over time, right? DDD was more about solving a business domain problem. So just know that entity here does not reflect entity and domain-driven design. And it's not a reference to entity framework. Maybe entity, Maybe the word entity has become the new helper or manager or library or source or code.
Starting point is 00:40:09 Awesome. It needs to be renamed immediately. It's used too much. It is. This is where they say, an object that contains critical business rules and critical business data is an entity. That's a simple definition. And they should be separated from every
Starting point is 00:40:28 other concern in the application. Yeah, sorry, I was just looking at the book. That's fine. So, this is kind of off-topic part of the course. If you had to read one book or you had to choose for somebody whether they read clean architecture or domain driven design i think we're gonna take whatever book we wanted i think i guess it's kind of a rude question i'm kind of pitting two great things against each other and like as you know it's apples to oranges
Starting point is 00:41:03 but i'm thinking like which one has more effect on my day-to-day coding i'm gonna say javascript the good parts yeah you know everyone's doing javascript now i honestly i no slight on domain driven design i loved a lot of what i learned there and the concepts i thought they translate well, but I think in the grand scheme of things, the content in this book is more about making you think about how to build your software in a better way. Well, so was DDD. It was, but I think... I mean, obviously, the audience that you're talking to, that you're trying to make this recommendation to, is someone who's trying to be an architect or do architecture see i and i don't i i guess that's where i don't necessarily see that i think these are both heavy architecture books this isn't like it's not like we're bringing clean code into the the choice for example so i i guess here's here's my take on it domain driven design
Starting point is 00:42:03 almost centered exclusively around the ubiquitous language. Being able to speak to a business person and translate that into objects in an application that you could look at. Like it was really about the communication and being able to say, this is what you need. I'm going to implement it in code. I would say that in different way, though. I mean, it was about keeping that language consistent in your code with what the business is actually using.
Starting point is 00:42:32 Yeah. So when you look at the code, a business person, you could literally talk to the business person about what that code is doing. And the business person could read the code and have an idea. Right. And that's important. I think that's valuable. i like about this and i i don't necessarily see this as only an architect i think the value that you get out of this is as a
Starting point is 00:42:52 developer like some of the concepts here with the inversion of control and data going one way but the dependencies going the other as a developer you can think about these things and you can say, oh, I see how I can make this to where it will be easier to swap out pieces in the future or something like that, right? I know, man. I think if you're talking, depending on who you're talking to, though, if it's like a junior developer, would you tell them this or would you say, hey, go read the art of unit testing? Or, you know what I'm saying? When you open up the whole world of books, that's a different story. That's what I'm saying. The question was phrased to two books that are both heavy architecture books.
Starting point is 00:43:33 So you're speaking to an architect. So you're already speaking to somebody who is not entry level. Yeah, I mean, that's fair. But I think it's nice to plant those seeds. You know what I'm saying? Like it's, it's such a hard thing because we've talked about it so many times and I don't want to go too far off, off topic here. Cause I know we can talk about this forever. That's Joe's fault. But I mean, we've talked about this, right? Like we've just by practice, by what we've done in
Starting point is 00:44:03 our entire careers, like your database is your core, right? Like we've mentioned that. And that's, and so you have a tendency to think of, okay, here's my UI, here's my service layer, here's my business layer, here's my database, right? And everything's pointing down towards that. This flips all that. And I think it makes you think about, okay, what's important? Well, storage is an infrastructure thing. It's not got anything to do with your business. It's literally just where the stuff exists. And so I think I like these for the book just to put those ideas in your head.
Starting point is 00:44:38 So here's my answer to this. I think that both would be extremely valuable reads to someone who is wanting to be an architect or trying to be an architect or is currently assigned an architect you know like any in that kind of role right i think that the clean architecture book puts it into plainer speak totally the domain driven design is a great book but it's it it's more wordy and it's it's easier to get derailed and and lose the understanding of what's trying to be gained like it might take you a couple times to grasp something whereas if you read this and then and then read that you might have a stronger grasp of it because i feel like and i don't know if you guys felt this but i feel like i've gotten a stronger grasp of ddd having read this one.
Starting point is 00:45:25 Yeah, definitely. So which kind of makes for the case of like, oh, maybe I should have maybe I should recommend DDD first. But I kind of wonder like if we had we flipped it, I wonder if maybe we would have had a much stronger understanding or, you know, or at least I would have had a better understanding of domain driven design having come from this one first. You know, the one plus I'll give DDD over this one is he had a lot more code samples in it. Yeah. And so it was easier, like if he said, like you said, he was very verbose in his descriptions of things.
Starting point is 00:45:55 And so sometimes you get lost in it, but you could always look at the code and say, okay, I think I get what he's saying here. And I'm not trying to say that as a bad thing. Like if you've read Neil Stevenson, for example, I mean, that man could go on like five pages just talking about how you're driving down a gravel road, right? And he's describing every little detail about every little piece of gravel as you roll over it, right? Like, I mean, it's a Neil Stevenson book, so you kind of know what you're getting into and you're like, okay, I mean, and it's good. It's great. It's a great level of detail, but yeah, you can get kind of lost in it at times so
Starting point is 00:46:28 you know this one i would say would be the starting point yeah i agree i think it sets up a lot of the foundation and again i think it's a good read for anybody just to plant those seeds so that you're thinking about this stuff as you're creating it whether or not you aspire to be an architect or whatever i do think it helps you at least put things into perspective and, hey, how do I build decoupled software so that it's easier to maintain over time? And thanks for derailing us for 10 minutes with that one simple question. So just to backtrack for a moment then, going back to this entity, the last thing I had said was that the entities should be separated from every other concern in the application. So what I mean by that is let's go back to this encrypting
Starting point is 00:47:08 example that was given, right? That, that, uh, entity, right. It's the core business rule of how to do the encryption, right? So that, um, layer or level, it's not concerned. It's separated from any other concern about how to read the data in. It's separated from how to write the data back out. It doesn't care about any of that. It's just going to use some simple interfaces to do that, and it's up to you to implement those interfaces to get the data in and out. It is isolated and separated from those concerns.
Starting point is 00:47:48 Yep. No dependencies on databases, third-party dependencies, user interfaces, nothing. Right. It's self-contained completely. It's pure business logic. Yep. Yep, so next section is talking about use cases.
Starting point is 00:48:04 And the difference here between use cases and like business rules or policies are that use cases are kind of additional business rules that are are that are not critical but they define how the system should work but without having they would have no impact on a manual business operation like this is something that you would do it's like almost like an example of a behavior that your system needs to account for. It's a description of how the automated system is to be used.
Starting point is 00:48:31 Yeah, it's specific to software. It has no impact on the daily running of the business any other way. It's literally just how your software works. They indicate how and when a critical business entity should be invoked. They indicate the inputs and outputs, where they come from. Oh, sorry, but not where they come from. Very important.
Starting point is 00:48:51 Just kind of back up on that for a moment there. We mentioned banking, right? And you might give a loan out to somebody. And if you were, if you, you know, part of the core business rule would be how do you decide who to give a loan to and the actual process of making that person a customer and filling out the loan paperwork. The steps that you go about doing those core business rules, those are the use cases, right? So if the customer's credit score is greater than this, then we will make them a customer and we will fill out this application and paperwork and whatnot, right? That's the example of a use case. And that could be an automated,
Starting point is 00:49:44 and that would be your automated system, right? So those are decisions made in your software. Whereas if some dude walked in the bank and you've known his mom for 50 years, you'd be like, he's a customer, right? That use case in that software has no impact on how they do business inside that office. And that's what we're getting at.
Starting point is 00:50:02 They're completely disconnected. The critical business rules are the same regardless. The use cases are for the software only. Yeah. And how the data gets in and out is totally irrelevant. And the entities have no knowledge of how use cases use them. And it's similar to the point we made before with the object that contains the critical business rules and business data have, they're totally separated from every other concern and application. Entities have no knowledge of how use cases use them. Which, you know, I mean, at first I didn't like this encryption example that he gave. But the more we go through this, the more I'm like, oh, this is so perfect.
Starting point is 00:50:43 Because let's bring back up this banging example, right? If you, you know, security is going to be important to you, right? But that encryption policy, that encryption entity doesn't care about how the data, where the data is coming from, how the data is being used or what it's being used for, right? It just knows it's one thing. I'm supposed to encrypt some data, and that's it. I got some data in, I'm going to spit it out encrypted. Yeah, and that's all it cares about. Exactly as Joe said, it has no knowledge
Starting point is 00:51:16 of how the use cases are going to use them. It doesn't care if it's for encrypting personally identifiable information for a customer or for an account number or anything like that. It doesn't care. And this is where we talked about the dependency inversion principle earlier. Bingo. Huh? Bingo? I got bingo.
Starting point is 00:51:38 Yes, you did. That was the third acronym tonight. I won. Higher level components know nothing of the lower level components. The direction is inverted. Should I try and explain that? Yeah, sure. I mean, yeah, we touched on it already.
Starting point is 00:51:55 So high level components know nothing of the lower level components in our encryption example. The encryption algorithm itself didn't know anything about how the inputs and outputs might interact with like say a terminal right and the way that works is through an interface right that when when you talk about dependency inversion so the way that we've always that we've talked about it is you knew up a new class right and and you call that class and then some method in that class and then it calls a database or whatever that's that's like dependencies pointing one way and actually the flow of everything's still going that way if you want
Starting point is 00:52:35 dependency inversion typically what you do is instead of knowing up another class like you call some class and then it calls another class and whatever, there's an interface that goes between those two. And logging for whatever reason to me is an easy one to talk about only because typically in any kind of software that you're going to put out in the wild, you kind of want to know when things go wrong. And usually the only way to retrace it is to look at a log file right software does it all the time well if you have your application and then you're using a library and you need to be able to log things in your application you need to be able to log things in the library you could just include that same logging application or that logging DLL or jar or whatever, and both of those. So log for net or log for J, right? And, but that kind of sucks. Now you have a dependency in that
Starting point is 00:53:31 library that has nothing to do with logging. You have a dependency on this, this log for J framework, right? And if some new framework comes out, then you're going to have to do something with your dependencies. Well, instead, if that, that-party library just has an interface for an ilogger you can new up that ilogger in your primary application and just pass it to that third-party library as the dependency you basically told it hey i know that you're looking for this interface for ilogger here's something that fulfills that interface use it you know looking for this interface for iLogger, here's something that fulfills that interface. Use it. You know, we keep saying interface, though,
Starting point is 00:54:10 but it's important to note that that's just one way that you could solve the inversion, the dependency inversion. You care to take a guess at how you might be, another way you might be able to do it? Not an interface. You could probably do like a service locator pattern. It's not the one I was thinking of, but okay. Joe?
Starting point is 00:54:28 Yeah, I'm just thinking interfaces. It's where you depend on, I guess you could do maybe an abstract class. There you go. A class, an abstract class. Yeah, you could totally do that, a subclass of it. Yeah, you could subclass it, and then you could even take it a step further because then you could go with a template method pattern inside of the abstract class,
Starting point is 00:54:47 and so then your subclass only needs to implement whatever pieces of functionality it cares to. The interface, I would say, is probably the cleaner, more common way, especially with modern languages, but it's not the only way yeah that's true but i guess that's the whole deal though is instead of letting that third party library control how it's going to use that logger or what kind of logger it uses you tell it what it's going to use you give it to it And that's how you invert the dependency. Instead of that thing, knowing what to new up, you give it what it's going to use and it just uses it. It doesn't care what it is. Right. So I read, I read some sort of example online that was interesting.
Starting point is 00:55:36 Somebody needed something that worked in IIS, like a plugin to IIS that was going to log messages on notifications. Right. And when they first started out, it was a very simple thing. Hey, just log it to this particular area. But then as things came in, they said, oh, well, you know, for certain types of things, we want it to email. Well, the problem is now when you go that route, what are you going to do? Have a bunch of if statements up in the thing that's really supposed to be this simple notification thing, having to know about, okay, well, how do I start up emails?
Starting point is 00:56:07 How do I start up an SMS if they want to do that? How do I start up these? Instead of that, you just pass in the object that knows how to do this notification. You give it to it. And then it just calls it, right? Well, think about this. I mean, this goes perfectly in line with this encrypting example. In that scenario, the input and output are, the policy doesn't care.
Starting point is 00:56:27 The policy is like how, you know, writing the data, right, in some particular format. But where it writes it to, what could be a file or it could be an email, that part it doesn't care about. Right. It just knows that when you call write, whatever you gave it, it's going to try and write it. And if you gave it a file writer, it's going to write it to a file And if you gave it a file writer, it's going to write it to a file. If you give it a database writer, it's going to write it to the database. Yeah. Right.
Starting point is 00:56:50 Well, because again, and I'm trying to make the distinction here because it's policy is the format in which it's going to write the message. Right. It's going to call and write. You're going to give it a message. You're going to give it some string like you know uh ran into this error but it's also going to include other things like here's the time the date you know the the thread you know what level is the message like so it's it's going to format that message that that's what
Starting point is 00:57:16 its purpose is is to is to um just going back to formatting being a policy right yep so uh just to pick back up where we were here with use cases these use cases are specific to a single application but the entities are generalizations so our entities can be used across multiple applications they're not tied to anything they don't care and i really like the point that um that use cases are specific to a single application if you think like about a batch processor or a mobile app or a website or some sort of service that's running like those are all different applications but they all use the same entities you know ideally so i thought that was kind of cool and one thing um the book like doesn't really touch on is um when i like when i think of use cases i think of very much like ux like this is what
Starting point is 00:58:08 the user does and i think there's a lot of carryover it's just that this is kind of a more specific like software architecture definition of use case yeah i mean it's kind of interesting that you brought up the user interface because there was one part in here where he says that the user use cases do not describe how the system appears to the user and i wrote a comment to myself because like well that depends on who you're asking right like you ask a ui designer and they're gonna be like whoa whoa whoa whoa whoa of course it describes how it's supposed to appear like when that when that user clicks the next button you know the use cases this is what you're supposed to see right so i think that part depends somewhat on the audience yeah i agree i think he was talking more from a
Starting point is 00:58:50 server-side type you know or you know i guess it doesn't even have to be server-side like a desktop application or something the business behind it and there used to be something like uh i forget now but there used to be some way of kind of like writing sentences as use cases where it's like, I, as a normal user, want to be able to do whatever so I can whatever. And so there's like this kind of structure. We've talked about this. This is the given when then. Yes, that was it. a logged in user, when I add a product to my cart, then the cart is updated to reflect the quantity entered. Man, just give me a storyboard. Oh no, man. I love given when then syntax for, for use
Starting point is 00:59:38 cases. It's so awesome. It's good for writing unit tests. I will say that because then it's very spelled out, right right and in very business terms but no i mean it just makes it so obvious to like what your codes should be uh if it's well written given when then yes it's really good but who wants to write like that yeah i do exactly i have oh good god you want to like write a ticket like give 10 of those in there? I definitely have. You have. I definitely have. Well, I don't want to write any tickets. Well, there's that.
Starting point is 01:00:10 I'm a ticket crusher, not a ticket writer. Oh, that's amazing. All right, so this next part was pretty interesting to me. And I don't think I ever thought about it this deeply. The request and response models so use cases accept simple request objects for input and return simple response objects for outputs now i've always done this at like a service tier right like you have a search request and then you have a response object like that that sort of makes sense to me but what they advocate for here is doing it in between boundaries at different levels,
Starting point is 01:00:46 right? So they're saying that your request object that went into your service call should not be the same request object that goes into your business layer call. And that should not be the same request object that goes into your database layer call. He basically makes a very strong point of those should be separate at every level. And and the reason and this makes perfect sense is they don't always change at the same time for the same reason and and it kind of sucks when you think about it because you're like man am i really gonna have to write you know request response objects for every single tier i have if i have a four-tier app i've got to have you know four pairs of these things all the way down. Yes. But this is going back into the conversation that I had about like, where do you put your interfaces? This is part of, you know, where do you put the DTOs, right? Because these
Starting point is 01:01:35 response requests and response models, like where do you put these things? If you're going to make a request to some higher level entity, right? It has to know how to read that data, right? So the interface for that thing, or, you know, if it's, if you're just gonna put the DTO there, it needs to be at the same level as that entity, right? And similarly, if it's going to respond with, with an object back, right, that definition of that object is going to have to be at the same level as that entity so that it can new it up and return it. Which means you might have a bunch of translation in between all those layers, right? That's, that's the thing that stinks. So yeah, you're right. You know, whatever the inputs and outputs are at any given layer, you probably want
Starting point is 01:02:21 those there because it makes the most sense there. Separating it out seems like an unnecessary abstraction. But that also makes you say that, hey, when you have this service layer, they got called and then that needs to talk to the business layer. You're going to have to have a translation of whatever that request was to go into the request into the next layer. And then you have to translate that to go into the request of the next layer, right? That's fine. I mean, that's the adapter pattern then it is and and here's the thing and i think it's worth calling out is they could be the identical objects all the way down right like it could be that you have uh let's call it um calculator request up here, right? That's going to be your request object. There could be a bank request object at the next layer, and it could be basically a copy
Starting point is 01:03:14 and paste of that same class. But the key is it is separate, right? So if that thing ever has to change, you don't have to funnel that change all the way up it's literally just oh you're going to have to change how this layer pushes data into that next layer right so essentially what i'm saying is the multiple layers aren't referencing the same class it could be almost identical looking classes right it hurts and it hurts it does does, but he makes a strong case for it, right? And we had a very similar conversation with the DDD conversation when we talked about if you had a customer object that was in a customer service namespace versus the customer object that was in the shopping namespace
Starting point is 01:03:59 or something similar to that, right? Don't get hung up on this idea that duplication is necessarily bad that you can't have these things repeated for specific purposes because what you're really trying to break here is you know these things are going to change at different times different rates for different reasons so you're trying to break that dependency so that when it does change in one it doesn't impact the other. Yeah, it doesn't flow all the way down. Yes. Pattern where it's going to adapt the data from one DTO to the next isn't necessarily
Starting point is 01:04:32 bad because it insulates you from change impacting something higher level. That's the key. It insulates you is exactly what you said. It breaks the chain. It's the firewall yes take going back to the previous episode now you don't have to like it no you don't and it feels wrong right like code duplication feels wrong but there's a very good reason for it here and hopefully what we all just said there drives that home well it's like he said in the last in the in the last episode
Starting point is 01:05:05 we covered it like um there was some comment where he says like we we see duplication and we feel honor bound to remove it right but there's there's different kinds of duplication right there there was like uh what was it like accidental duplication and then true duplication or something like that like i forget but you know one was where the things might look the same but in reality they're going to change at different rates for different reasons so it's just coincidental that they that they're the same even if it is basically a copy and paste i mean in this case it could be right it could be um but it was interesting the next thing that they say is there should be no dependencies on anything.
Starting point is 01:05:46 These should be simple objects. The request and response objects should be POCOs or POJOs or whatever you want to call them. DTOs. Yes, they are plain old objects. Let me tell you, I don't envy the programmer who has to defend this in the pull request review. Listen, Cody Blolocks told me that sometimes there's coincidental duplication. And that's why
Starting point is 01:06:08 I've copied and pasted this class four different times. You tell them to send their complaints to the Slack channel. That's right. That's right. Oh, and I love this too.
Starting point is 01:06:21 They say that it seems like it might be a good idea to return that entity object with your data, right? Like, hey, we've got this encryption class up here. Let's just tack it on to the response object here because then everything can use it. No.
Starting point is 01:06:36 Here we go. Okay. So entity framework has been our, let's say that- Our whipping child? Yes. The whipping boy du jour. We've beat up on entity framework for many episodes now about this because it's very tempting to just return back
Starting point is 01:06:57 that entity framework object. But this is making a strong case for why you shouldn't do that. And same, same with the domain driven design book was making a strong case for why you wouldn't want that exposed outside of its layer. Right. And he even made a point. I don't remember. I don't think it was within this particular part of the book, but later on where he's saying like you know you might be Tempted to have an object that is A row of a database and you're Tempted to remove it or I mean To return it to return that row
Starting point is 01:07:32 But you can't do that because then You're you're leaking that that Dependency and you don't want to do that You're leaking where it came from And that's the problem and now You're coupling everything else To that decision that you've Made you're coupling everything else to that decision that you've made which was hey i want to not only use entity framework but i'm going to use sql server
Starting point is 01:07:50 and now when you decide to change either or both of those you you've you've made more work for yourself yep and i've seen it especially when it comes time to actually change stuff the database you're like oh i don't know there's all this downstream effects. I'm going to change this one thing. It's going to break a whole bunch of stuff. That's an example where you're missing that insulation there. Let me tell you, though, if this is the worst thing that you're sending me in your pull request, we're going to be all right.
Starting point is 01:08:19 Right on. Yeah, man. Well, yeah. And, you know, I know we're picking on Entity Framework here, but not because we don't like it. No, yeah. Nothing at all. Nothing can be further from the truth. But it's just that, you know that meme about like, I've seen things.
Starting point is 01:08:40 Right? Like, that's what it feels like. And so that's why we pick on entity framework because we've seen some bad things with entity framework where it's like uh this is dirty and it's just probably the easiest to pick off because it is probably the most ubiquitous in terms of you know orms in the dot net world yeah definitely yeah but yeah now here's the other thing right like the what you said about they change at different times, the whole reason why you would never include this thing back.
Starting point is 01:09:11 What if that, for some crazy reason, that encryption component did change? Now you've got to change all your downstream code to handle that change, right? Not necessarily. No. No, no, no. That's why they say don't return it, though. So if you're returning a response object,
Starting point is 01:09:28 you don't tack on that higher level component because if you're returning that thing down and it's now five layers deep and something five layers deep is trying to use it and that thing changed,
Starting point is 01:09:39 you've now, you've leaked out that dependency all the way down, right? It'd be the other direction though, right? It would be the other direction though, right? It would be like not passing in your database row to the encryption. Oh, no, no, no.
Starting point is 01:09:51 But remember, the whole point was do not return a reference to the entity object. So what I'm saying is if you got a response, you went to use that entity object, and instead of just getting the output of it and sticking it on a property on your POCO. Oh, I see what you're saying. Yeah, yeah. You don't return it back out because now you've you've made other things dependent on that entity object when really it should have just been your use case so so yeah
Starting point is 01:10:13 you would return back here's the encrypted string correct not necessarily which encryption algorithm you used which that algorithm might be encompassed and you know enclosed in a particular object yep hey and this is where i did put in the note, common closure and single responsibility principles. Boom, I remembered it. Yeah. All right. Stumped to a slip, Jim. Yeah. I thought we already agreed that that was wrong. It was the closed caption programming. All right.
Starting point is 01:10:47 So who wants to conclude on this one? It's just kind of. So, okay. So just to wrap up this section, then the business rules are the reason a software system exists. And these business rules should remain pristine and they should remain independent and reusable. All right.
Starting point is 01:11:03 Who's going to lead in the next one? You got to do it properly. Whoever does it. Allah is the only one who can do it. Oh, man. Now this is, I was just going to say it. No pressure. No, you can't just say this.
Starting point is 01:11:14 You're the chosen one. Yeah. That's right. All right. Here goes. Are you ready? Screaming architecture. That's pretty good. I like it. That was pretty good. I like it.
Starting point is 01:11:25 That was really good. I like it. So the example here, we talked just a little bit before about how your project or your application kind of should reflect this purpose. You can imagine if, in the example of that encryption program that we were talking about, if you opened it up and you were immediately confronted with things like
Starting point is 01:11:43 character reader line scanner pretty print formatting you know like those things to be scream console application but they don't scream what the purpose is which is that this is should be encryption so in an ideal world i should be able to open this project and like be confronted immediately with the purpose of the application or the component, which is encryption. And the whole thing should be roughly themed around encryption because that is its reason to be. Man, I love this. Last night, I started up Visual Studio on the Mac and I created a new application and you
Starting point is 01:12:27 open it up. And what do you see? Folders, views, models, controllers. And I'm like, man,
Starting point is 01:12:34 that, that burns me up. And even the same thing, like when I was initially looking into doing react JS on the web, all the tutorials were controllers, views, models. I'm like, no, I'm not burying all my stuff in there. If I'm writing an application about podcasts, I'm going to have a podcast folder and I'll put my views, models, and controllers in that. And if I have views where I want them,
Starting point is 01:13:01 thank you. That's right. Like, dude, this stuff makes me so mad. And honestly, I don't know about you guys, but anytime I start to learn something new, it really frustrates me. When I look at the file structure, and the file structure is something like source views. Right. And I'm like, no, in my soul, I can't do this. I've never been able to do that by the way, because I look at it and I'm like, so you're telling me if I write a real application, this got some real meat to it, that I'm going to have 50 views in one folder. Really? No. And then, oh, oh, by the way, all the models that are used in those views are going to be in some models folder.
Starting point is 01:13:42 And I'm going to have to scroll up and down to find all this stuff. And it's not going to make any sense, man. It like, I actually got angry and happy when I read this because it reminded me of all the bad. And I literally just created a project in visual studio last night. And it did this very thing where it's like, it screams framework and tells you nothing about what you're actually doing. Definitely. Uh, you know, creating a solution with a visual studio was definitely the thing that came to mind like as i was reading this and i was kind of like okay well what am i thinking of like as an example of how this is wrong you know when you create a an mvc app a web app with visual studio and it's like here's your models here's your views here's your
Starting point is 01:14:19 controllers right like that was definitely the example in my head of like, oh, yeah, that that's just the architecture of what I created and the tooling that I used. That's not necessarily anything about the application I want to create. But I don't want to just pick on them. Like, it seems like every tutorial out there are the same way. Like, OK, so we all do EXTGS programming. Go read their tutorials, views, models, stores. Right. No, that's not how you write software and if you do write software you're doing it wrong if you're doing it that way straight up we're all doing it wrong yeah we're all doing it wrong but but i mean seriously like it is very important that somebody be able to open up your application and look at it and say, oh, okay, there's a customer service section.
Starting point is 01:15:07 Okay, there's an accounting section, right? Like, make it obvious. It should scream the architecture. Well, what if we said that maybe, because I definitely think that websites are the biggest defender here. And there's been times I've downloaded like application skeleton projects and stuff from github just because it automatically set the folders in the prescribed way for me and i i heavily dislike that but if we're saying you know what this is my website project it's going to be little and tiny and all it is is uh you know basically a facade for the website and i'm going to have my other stuff and some other component and at that point then i think
Starting point is 01:15:44 it's kind of fair because i'm saying well my project it is the framework it is the website yeah i still i still don't like i just don't have a good solution because i get that if i you know have like an asp site or something or a or a you know angular site like i like that things are kind of organized by layer and i think it makes sense and it's okay to hop around although you inevitably end up with like five different freaking things open that span all the folders anyway. And that's what I was going to say. Yeah, go ahead. The problem is this, though.
Starting point is 01:16:10 I mean, we talked with Michael and Clint about, you know, a while back about the new project, you know, the file new within Visual Studio, right? And that whole experience and trying to improve upon that, right? So if you're a developer who is working on the tooling to improve the file new experience, right? You can't know what the end application is going to be. You have it by a name, but that tells you nothing about what it's you know uh what it really is necessarily so i mean from it's it i guess it's a double-edged sword like
Starting point is 01:16:53 you know from their point of view right whether you are authoring um create racked app or you're doing file new experience in visual studio like you're going to lay down some structure that you you know as a guide to somebody but it's going to be up to that developer to just take that as like okay you know this is a um an example pattern of like how you think things should be laid out, but it's not necessarily the end-all be-all answer, right? Yeah, I think that's fair. I mean, he even goes in this chapter and says, you know, people who write frameworks are very proud of them and they should be.
Starting point is 01:17:37 I mean, there's a ton of work that goes into frameworks to enable you to write software faster, right? That's the purpose of a framework. And if it's not enabling that, then you probably chose the wrong framework. But on the flip side, he also says you should scrutinize those things. If your software starts looking like it's about the framework and not about the business problem or whatever you're actually trying to create, then you're probably not doing it right.
Starting point is 01:18:03 And I agree with that i i actually like one of the bullets we got here if your architecture is based on frameworks then it cannot be based on your use case i agree with that if you're coding around it go ahead just thinking like if i were to start up a new view uh what project i was looking at somebody's recommendations they end up with uh 18 total files and folders just for like the basic kind of like you know there's some files in there for like your index or you're sitting your css or whatever your basic stuff routing and there's a couple folders for where you're supposed to put your stuff but then you know there's a an npm folder in there and there's a there's a no folder just full of packages too it's just like crazy to
Starting point is 01:18:40 think like hey i'm starting a new website and i've already got 18 000 files and folders and then the first thing you do is you go into like you like hunt around for index right and then you like delete six lines and put your you know two lines in there and you know you start from there it's just crazy to think you've got this whole huge you know scaled exoskeleton kind of built around you yeah go run create react app and then go look at the hundred of node modules that are in that folder yeah that's the video of me doing just that i'm like oh my gosh my computer ran out of space pause the video yeah oh man so here's another here's another anecdotal thing that i think is kind of apropos here house's architecture is focused on usability, meaning does it have a bathroom?
Starting point is 01:19:27 Does it have a kitchen? Does it have a bedroom? Are there doors in between all those things? Are there windows? Not whether or not the outside's built with bricks or stucco, right? And so what they're saying is your application should focus on the usability of the application, what it's supposed to do.
Starting point is 01:19:44 Worry about the frameworks and the infrastructure decisions when the time arises. Focus on your core. And sticking with the theme of this chapter, though, that blueprint for that house screams what it is. Yes. Right? Yes. So you can immediately look at that.
Starting point is 01:20:02 So if you were to look at your code's directory structure as a blueprint, for example, or the solution structure as it might look in like an Eclipse or Visual Studio or Visual Studio Code, whatever you're using, then if you think of that as the blueprint, does that structure alone scream the architecture and intent of your application hopefully the answer is yes yeah and i was just thinking like if if we were you know building a house and we were using some sort of framework we what we're saying kind of like is a bad example would be i open up the house project and i see folders like surfaces and portals and measurements
Starting point is 01:20:46 because that's not that's not housey like sure houses have those things but that's not specific a better way of thinking about it would be if I open up the house project and I see a folder called doors or windows or walls or like those things I see that I know what we're talking about and it helps guide me as a new program and an existing one to the place where I want to go. Like, so yeah, I mean, I like this idea.
Starting point is 01:21:10 It's still, it kind of bothers me. I think I have some like internal conflict because it's so common to see this kind of stuff in front of frameworks that I wonder, it's like, are they all doing it wrong or is there something I'm misunderstanding? I didn't think about it, but I think what mike said
Starting point is 01:21:25 was probably exactly it right like when you're building the tooling to to set up your framework like you said you can't know the use case for what people are going to use so you have to set it up in a way to where it makes sense right creating interviews models controllers thing fine right you you scaffolded up the application now to really use it there really should be something that says hey don't leave these out here put them in a folder or something right like you know you know i think uncle bob has gotten to the point in his career where he's got people that he could pay to do the ui for him so he doesn't care yeah i need i need to figure out how to get there oh that's awesome um and and he points out again he's always deferring decisions infrastructure type decisions
Starting point is 01:22:12 the details until the last possible moment yeah i'm totally kidding by the way i know he's done a lot of stuff i'm gonna tweet him that you were terribly serious. Oh, I'm sorry. I'll be right back. And then they pose this question in the book. I'm pretty sure that we all would have come to the same thing, but what is the web? What layer is that? It's your IO. So it's low level.
Starting point is 01:22:37 Yep. Exactly. All right. So there's the theme and the purpose of the architecture so the architecture is all about the structures that support the use cases of the application and architecture is not a framework nor is it supplied by a framework and that's kind of what we were talking about before with those web projects where it and so just you know in going back to the purpose of this though similar
Starting point is 01:23:07 to what alan said a moment ago the a good architecture allows you to defer and delay these decisions but it also makes them easy to change your mind about those decisions no yeah and i think talking about those frameworks the way we did like really exemplifies that like the first thing you do is you go in there, you chip your way into something that actually matters, which is tough to find. And you chip your little changes in and then refresh it. And that's the opposite of deferring decisions. The opposite of delaying all those details. It's like you're inserting your application into their framework.
Starting point is 01:23:43 A little funny story to go along with this, with the, uh, the details. So I was trying to force myself to use visual studio on Mac, just see how it was, you know, if it was good, if it was bad, whatever. And, you know, in visual studio on windows, if you start up a new app, you can create a local database, right? It's like a little mini SQL server or SQL server light baked in. Oh, local DB. Yeah. Yeah.
Starting point is 01:24:07 And so, you know, I was going to go do that really bad because I was not deferring decisions on what I was going to do. I was just going to set up a database. In Visual Studio for Mac, they don't have that. And so it forced me to defer my decision. And I was like, you know what? This is a good opportunity just to find an interface and mock
Starting point is 01:24:23 some data out, right? So it kind of forced me. So it was almost nice that it put me in that mind like, you know what? This is a good opportunity just to find an interface and mock some data out. So it kind of forced me. So it was almost nice that it put me in that mind like, no, thou shalt not have the local DB. You will do this right. So in other words, the takeaway here is in order to really take advantage of these principles and write good code, all Windows developers should do their coding on a Unix-type platform. That's right.
Starting point is 01:24:47 And all Unix developers should do their development on a Windows-type platform. And then that way you're forced to write good interfaces and mock classes. That's right. And delay those decisions for as long as possible. There it is. I think I summed up this entire book. Hate, hate, hate, hate, hate. Say what? You go to lunch together and hate? And then hate, hate this entire book hate hate hate so what you go to lunch
Starting point is 01:25:06 together and hate and then hate hate hate yeah all right so we know we now know that frameworks are tools and they are oh that came out wrong they're they are tools that we use. They are not waves of life. They are not our architecture. Yep. And as we said a minute ago, he says, look at them with skepticism. And I agree with this. I think that's legit. They should not dictate your application architecture. They should not force controllers, views, models, et cetera.
Starting point is 01:25:42 And then he also says, if you're going to take a framework, think about the two things. How should you use it? And how should you not? Or how should you protect yourself? That point there was my favorite takeaway from this section. How should you protect yourself away
Starting point is 01:26:00 from the framework that you're using? Isn't that interesting? And in JavaScript world, I think writing your own modules is the answer to that. That's it, right? That's how you keep yourself away from that. The more you chisel your stuff
Starting point is 01:26:13 into those folders, the worse off you're going to be. So if you can kind of package those guys, like otherwise you're totally at the mercy, just not doing it. And we're not saying don't ever use Angular or react or view or ember because those guys are totally prescribed frameworks we're saying do it but don't let
Starting point is 01:26:31 them dictate your application architecture right so yeah i was going to bring up react as an example then because like if react is a framework well it's not angular is react is not react just a view layer right a view framework yeah you wouldn't call it that no not so much i mean the they don't really enforce much i mean if you just want to create a rack react component with a few lines of code and jam out some html can totally do that. Like there's nothing stopping you. It's not necessarily going to be the best way to do it. Angular is a framework. Angular is full on NBC, right?
Starting point is 01:27:12 I'd say view and react are very much just view layers that you can, you can basically do as little or as much of it as you want. There's no prescribed major path for any of them. I mean, yeah, I was just curious to see like what it refers to itself as and it's called it's referred to as a it is just a library is what they refer to it but um and and looking at the wikipedia page they say it could be using combination with other libraries or frameworks yes so typically what you hear about with React is it'll be used along with something like Redux or Flux or any of those types.
Starting point is 01:27:53 Those are frameworks, right? Those dictate how you do things and how data flows. But React itself is literally just spinoffs of HTML on the page, which is, you know, kind of nice. So, yeah. Quickly wanted to go over testable architectures. If you've done your job right, which a lot of times means unit testing up front, then unit testing should be easy to do.
Starting point is 01:28:16 Because as we've talked about many times before, if you put your unit testing off, it can be really hard to do because it's really hard to set up your code in such a way that it's going to be unit testable and a lot of the reasons that your code is hard to unit test is because it's mixing these levels it's doing things that it kind of shouldn't and unit testing is a nice way of kind of enforcing that and entity objects will be plain old objects with no external dependencies so those should all be nice and testable use case objects will coordinate the use of entity objects
Starting point is 01:28:50 again no infrastructure dependency there so yeah i mean testability is great just to just to step back where i wanted to finish my point with the react thing though because like okay fine so let's say react isn't a framework and let's pick on Angular for a moment. How do you protect yourself from Angular? You don't. I mean... You buy in or you don't. You do as little as you can in Angular and you do as much as you can out of it. I think what Joe's saying. Which would be totally weird you've never seen
Starting point is 01:29:25 an angular app written like that but you would write all your javascript all your core javascript functionality would be outside of angular as much as possible and you would only use that i guess for the presentation and that'd, that seems like you're fighting the framework at that point, right? I know. Yeah, it's, man, it's such a tough thing. But that's why that statement that he said, how do you protect yourself from the framework?
Starting point is 01:29:53 That's why it kind of hit home for me. That's when you use something else, right? Like you almost just go after other patterns. Like I said, Redux is a good one, right? Like it's more of a prescribed pattern than a framework. Whereas Angular is a full one, right? Like it's more of a prescribed pattern than a framework. Whereas Angular is a full-on MVC framework. Like you have to code within the construct of it.
Starting point is 01:30:12 Otherwise, it's just not going to work right. So yeah, I mean, I think when you choose something like that, that's what it is. But I think you can still architect it in a way to where it would be meaningful. Like you could set up your folders to say, hey, this is my customer service area. This is my accounting area. That kind of stuff. So that's, that's a hard one, man. Yeah.
Starting point is 01:30:32 I don't know. All right. Well let's just wrap this up by saying that your architecture should quickly identify the purpose of your system. It should be screaming that architecture. Oh man, I love this. I put this in here. So he wrapped up this particular section with,
Starting point is 01:30:55 what happens, you've written the software and then somebody comes over to you and says, hey, we see some things that look like models. Where are the views in the controllers? And then your response should be, oh, those details, they needn't concern us at the moment. We then your response should be, oh, those details, they needn't concern us at the moment. We'll decide about those later. Like, how awesome would that be?
Starting point is 01:31:10 I've never been in a position to say that, but that would be pretty cool. All right. It's kind of like Obi-Wan talking. These are not the views and controllers you're looking for. Those don't concern you. Oh, man. All right. so with that hey guys for those that did leave us a review
Starting point is 01:31:30 or have in the past like we've got many many many now and we read them all thank you very much for taking the time to do that as always if you wouldn't mind doing it please go to www.codingblocks.net slash review and leave us review on iTunes or Stitcher, or I think even pod chaser we have. So any, any one of those things, you can find the links up there. So if you want to give back, that's a great way to do it. All right. And so with that, let's go to my favorite portion of the show. Survey says... All right. Last episode, we asked, what is the oldest code that you actively, regularly work with? And your choices were less than one year, green as can be. One to three years. Was there life before Angular? Three to ten years, back when JavaScript only ran in the browser. Ten to fifteen years, pre-jQuery, we had to get element by ID back then.
Starting point is 01:32:37 For more than fifteen years old, pre-stack overflow. You either knew it or you didn't. So I think it's my turn. I'm going to say most people say three to ten years, and I'm going to go with 36%. 36. Three to ten, 36. What do you say, Joe?
Starting point is 01:33:03 Just because Alan stole my answer, I'm going to say 10 to 15 with 28%. Okay. They're programming in COBOL now? You could have. 10 years is not that long ago. Yeah, it's really not. See the gray in my beard? This is because of JavaScript.
Starting point is 01:33:24 See, I have a beard because all the hair fell off my head down my face. Yeah, I mean, I'm wearing a hat for a reason. The reason is JavaScript. All right. All right. So then Alan wins. Oh, really? I even fell within the percentage.
Starting point is 01:33:40 Nice. Three to ten was by far the most popular 43% of the vote. Nice. Yeah. It was by far and away the winner. Okay. Sadly, we do have some that are working on apps that are 10 to 15 years and that are more than 15 years. Ouch.
Starting point is 01:34:08 What was the second most popular? Those two. Oh, man. Wow. Yeah. Ouch. I'm sorry, guys. Those two were tied for a second.
Starting point is 01:34:18 I mean, maybe you like it. I don't know. Everybody has different things to float their boats. I would not want to. Yeah, that was, yeah. All right. So. That's kind of sad.
Starting point is 01:34:35 Like, I always felt like looking at job postings, it always seems like they're like the new projects. But maybe that's kind of like a, you know, you tend to see more job postings for like newer, hotter projects because those are the teams that are hiring and others have kind of solidified. Well, you know, you guys are being like really negative about this. Maybe the people that wrote that responded with those answers, they're all working on something like, you know, they're they're working in C and they're working on the unreal game engine or they're working on the linux kernel you know but they're doing fun cool things in a cool language but it's just an older code base we'll go with that yeah i mean i think
Starting point is 01:35:16 i think 10 years is not crazy like i've written written lots of code one 10 years ago. It was all awesome. All right. So with. Show my age here. Yeah. With Valentine's Day coming upon us. This episode survey is. Have you ever made a mixtape? And your choices are.
Starting point is 01:35:50 Does a playlist count? count oh it doesn't then no i haven't or man i got my technique down in everything i know exactly when to play bon jovi's five words yes i have i can't wait to hear the results of this one. That's how I got on. Do teens these days send a YouTube playlist? Yeah, man. Teens these days don't even talk to each other. They just sit there and they're standing next to each other, tapping on their phones, right? Your friend's phone buzzes. Yeah, I just sent you a message.
Starting point is 01:36:21 There's no such thing as interaction. I miss a little about it. I have no clue no clue yeah you didn't have to woo anybody nowadays did either of you get my five words reference though i did not oh no wanted dead or alive wanted dead or uh it's not like a thing in the bon jovi songs where it's like these five words i swear to you he's always saying that no i didn't get it all right man let's go back before my time what liar before your time freelancers and small business owners i feel for you tax season is here and there's a good chance that many of you are trying to dig your way out from underneath a pile of receipts and spreadsheets
Starting point is 01:37:11 do yourself a huge favor and stop digging before you completely disappear under that abyss of paperwork go and check out freshbooks cloud accounting software not only is it going to save you a ton of time and stress, it might actually change the way you feel about dealing with your taxes. Need to send your accountant a quick summary on the amount of tax you've collected last year? How about pulling together a profit loss summary? FreshBooks can generate these reports in seconds instead of the hours it would take you to do them manually. You can even set up FreshBooks to import expenses directly from your bank accounts,
Starting point is 01:37:45 which means next time you use your debit card for that meal, tank of gas, or new computer, boom, the purchase is recorded instantly in FreshBooks. All this and FreshBooks is ridiculously easy to use. It's made especially for people who don't like dealing with numbers and their taxes. Right now, FreshBooks is offering a 30-day unrestricted free trial to our listeners. To claim it, just go to freshbooks.com slash coding and enter coding space blocks in that how did you hear about us section. All right, so getting back in here, we're going to get into the last parts of this. So here we are on clean architecture it's
Starting point is 01:38:26 really about the separation of concerns we talk about it a lot we've mentioned it about a billion times in this book and that's really what it is dividing software into layers like an oger like an ogre yeah okay Like an ogre? Yeah. Okay. You don't remember, like, ogres are like onions. They got layers. From, uh, what's the movie name now? Shrek?
Starting point is 01:38:58 Shrek, there you go. Oh, man, I don't remember that. Sorry, man, my ogres are all like World War, like World War got based down. I down like i just think like the two-headed guys yeah sorry man picture anyway uh this i wanted to mention this is actually the chapter that like is that shares the name with the book right so we're finally talking about we've been building up all this time to the clean architecture and it really brings a lot of things together we've talked about the separation concerns we talk about the layers we talk about being independent of frameworks things should be testable it should be independent of a ui database um they should be independent of interfaces to third parties we've talked many
Starting point is 01:39:38 times about how dependency injection is really crucial to being able to do this. And now we're kind of all folding it into one single picture. I want to just wrap that, you know, come back to that though, because he said that we're finally in, you know, the book is titled the clean architecture. This chapter is the clean architecture. So we're finally learning how to do the clean architecture we are this starts on page 201 welcome to the beginning chapter 22 and we're finally getting to like oh this is the clean architecture okay that's awesome let's discuss this diagram that we are i don't know if you've heard but our ability to describe a diagram is amazing. Yeah, man. We're working on it. I will say it kind of sucks that this diagram is completely inverse of the language that you would use from high to low level components.
Starting point is 01:40:33 Okay. I thought about that. That drives me a little bit bonkers. Okay. First of all, let's get into the diagram. The diagram, as he titles it, is the clean architecture. The diagram, as the rest of the internet would describe it, is the clean architecture. The diagram, as the rest of the internet would describe it, is the onion architecture.
Starting point is 01:40:47 It looks almost identical, man. I was a little bit bothered that he never... He's been really good about citing references and whatnot and giving credit to other things or calling something out if it's already a known thing. And it kind of
Starting point is 01:41:03 like... I don't know. There was something that just irked me if it's known already a known thing. And it kind of like, I don't know, there was something like just irked me about it. Like, why are we not like facing, you know, calling out the elephant in the room here? Like, why are we ignoring that? It's pretty close. I mean, yeah. I thought you did mention it in the book. I didn't see it. I never saw it. I didn't see it. It wasn't said.
Starting point is 01:41:22 So, okay. We've been dancing around this onion architecture diagram in all of our previous conversations and with the high level and the low level conversations but i think i got a way to picture what you just described where you were like um were you saying like it's the inverse of how you would think of it maybe it's it's this uh concentric circles within each other because we're looking at it top down. But if we were to look at it from its side, maybe it's a cone, an inverted cone.
Starting point is 01:41:51 Oh, it's like a ziggurat. So it's like- Or the peak of it is the entities. Yeah, it's an ice cream cone sitting upside down on the table. So that the very tip of that cone is the entities. And as you go down at closer to the table that bottom layer that's touching the table that is your external interfaces because that's the interface that that
Starting point is 01:42:13 cone is making to the table i mean that that's that's a good description it's not how i looked at it but you make it you make a good you're right it's not how i looked at it either but as you guys corrected me on the higher high level versus low level, right? Like that was kind of in my mind, like how I was able to like make sense of it all. I was like, okay, it's a cone. Okay. I'll buy that. So let's hit it here.
Starting point is 01:42:35 So the innermost or the tip of the ice cream cone, which would be facing up towards you. Yeah, but we should say ice cream cone because you hold them upside down. Yes. Let's go ziggurat. I don't know what upside down yes let's go ziggurat i don't know what that is what's a ziggurat okay it's like the pyramid that has the steps like then and like a necropolis okay i'm gonna say i'm gonna say how about a street cone then what would you call this like the orange cones okay there you go yeah you would see like in a construction site or wherever they're trying to direct traffic.
Starting point is 01:43:06 Okay, there we go. A road cone. A caution cone. We don't even know what to call these cones. Dang it. It's a freaking ice cream cone that fell out of your hands. You lost the ice cream and the cone's sitting on top of the table now. Traffic cone.
Starting point is 01:43:20 That's what they're called. All right, a traffic cone. Here we go. So the innermost tip that is pointing up is your enterprise slash critical business rules. That's what they're called. All right. A traffic cone. Here we go. So the innermost tip that is pointing up is your enterprise slash critical business rules. That's what we talked about. Should depend on nothing. It is literally floating out there. It's pluggable.
Starting point is 01:43:34 You can put it on anything you want. The next ring in, so moving further down towards the road, the ground, as it were, is your application business rules. This is your use cases. Then your next fatter ring as you're moving down towards the ground is the interface adapters, your gateways, controllers, and presenters. And then the one that is touching the ground, these are your outer most layer here. These are your frameworks and drivers, devices, web, UI, external interfaces, DB, file systems, all that stuff. So as he put it, you're going from more abstract down to the details. And the details, even though it sounds really weird to say it, is the database. The details are the UI. The details are those things that you could literally swap out
Starting point is 01:44:25 if you wanted yeah and um just look at the go over real quick again so the entities we said that's the core that's the thing that's used by everything the next layer there was is the use cases and i wanted to call that out specifically because the use cases we said are application specific so that means everything past that point is application specific. Your gateways, your controllers, your presenters, application. Even your database, your external interfaces, your UIs, those are all application specific. The only thing that is not application specific is your entities. That's business specific. So again, looking at this thing top down then,
Starting point is 01:45:06 the entities are our innermost circle. They are the most general and they are the highest level within the application. Yep. So basically what we're saying is the inner circles are your policies. Your outer circles are your mechanisms. In the onion architecture, I purposely in the show notes, I put infrastructure in places because I love that terminology from the onion architecture, right? Databases, file systems, that's infrastructure decisions that you make. And I like that naming like mechanisms. I like, I like the notion that it's actually something you put in place. The inner circles, your entities cannot depend on anything that is further in the case of we're talking about looking down. It can't depend on anything further down from it. Everything at the bottom depends on everything at the top right that it the dependencies go up
Starting point is 01:46:06 not down and the outer circles cannot influence the inner circles so the things down at the bottom your your infrastructure your databases all that stuff it cannot dictate what your business entity is doing yep and then we're going to go over basically each one of those. They're not layers because it's not an onion. We're going to talk about each segment of the cone here. And entities are the core there that are shared between applications. They should be usable in many applications and should not be impacted. This is just what we said before.
Starting point is 01:46:42 They encapsulate the most general high-level rules. So calculating interest, right? What are some some other rules that would live in here encryption calculating interest uh order tax calculator yeah uh okay amortization sheets i have all kinds of stuff that just boils down to it right all right so next layer is use cases use cases are application specific and the changes here should not impact the entities and it shouldn't be uh impacted by details further down on the cone like uh you know what database you're using so uh if we remember those use cases you want to give an example of uh of those? A use case that came to mind was like batch processing of orders, right? Like if you have something that needs to be released to pick out on the floor or something,
Starting point is 01:47:34 that's a batch process that is very specific to your application, right? You're going to go through, you're going to print out paperwork and send it out to the floor or create some sort of digital report that people are going to go use well the example we gave before was if the um if the customer's credit score met a certain limit then you would create a customer object for them for that person initiate a new loan yeah initiate the loan yep and those details are abstracted So how we get the credit score, how the loan is provided, that stuff is at a lower level. This is just that use case. It's that description of what should happen. Yeah, so these use cases, they orchestrate
Starting point is 01:48:16 the flow of the data in and out of the entities. They're directing the entities to use that critical business rules that we talked about earlier to achieve the objectives of the use case then on to interface adapters these are the things that convert data from the different data layers to the use case or entity layers these are things like presenters, views, controllers. No code further in should have any knowledge of the database. I guess in our case, we would say no code further up. So the use case and entities have no knowledge of the database.
Starting point is 01:48:56 Right. And this is what we said right here. This converts data from data layers to use case or entity layers. That's where we were talking about every single layer should have its known request and response objects and so this translation of that data between those layers that's where this this would happen these interface adapters yeah and now we're on to frameworks and drivers which is um basically the uh the bottom of this cone here these are the the lowest details things these are the websites the devices um these are the glue
Starting point is 01:49:33 that hook up the various wait what did i skip something no i started saying something that's different notes i think what we're trying to say say is these are the glue that hooks up things. So like this is like an example is SQL Server. You're not writing much code in this particular layer, right? We use SQL Server, but we don't write it. We use Apache or IIS, but we don't write those things. So we're hooking up like IIS to the rest of our application so that it can be served up.
Starting point is 01:50:08 And similarly, we're setting up SQL Server so that it can serve up the data, but we're not really writing SQL Server itself. We're not writing Apache itself or IIS or whatever. And this is where the inversion stuff would happen too, right? Because it's like the entry point into your application to a certain degree. So if you have a website and you want your UI to, and your business layer to utilize data from a database,
Starting point is 01:50:37 then you're probably going to inject your SQL calls. Like you're going to create those classes that call to the database and you're going to pass those up to your business layer so that the business layer can just say, hey, go get me account data or go get me customer data or whatever. This is why it says this is where the glue is. This is where the inversion happens.
Starting point is 01:50:56 No, no, no. That's the adapter though. What you're describing is the adapter. This frameworks and drivers, these are all the tools that we're using. These are the lowest level tools that we're using. These are those. These are the lowest level tools that we're using. I don't think the we're going to run on Apache. We're going to we're going to run on Apache. We're going to use Oracle and we're going to configure Apache to serve up our application.
Starting point is 01:51:16 And we're going to configure Oracle to serve up our data. Like, though, that's the gluing that's being done because he makes the point like you're not writing code in this section. And then what you described, you are writing code. And you're writing a decent amount of code to do that part, right? That's the interface adapters. Okay. Yeah, I got fed off when I saw the word glue. Because when I saw glue, I immediately started thinking, like, wait, that's how we connect layers with glue, right?
Starting point is 01:51:43 Right. But not the case. wait that's how we connect layers with glue right right but uh i i think that's where and this is where by the way i've gone looking for code examples on how he's done this stuff and i and i'm going to continue to look because i would love to come back to this because this layer this layer is are the details that don't matter these are the details that we defer which web server we're going to use Which web server we're going to use, which app server we're going to use, which database server we're going to use.
Starting point is 01:52:10 These are the details that we're going to try to defer for as long as possible. And we will eventually wire them up, right? We will eventually install something, configure something and use it, right? But we're going to hold off on that decision for as long as possible. That's what the frameworks and drivers section is okay yeah i think i got hung up here because i kept thinking like
Starting point is 01:52:30 okay well where's my website then on this on this chart and it's like oh it's not it's not really reflected here because it's got use cases it's got controllers it's got ties into database and web here like it this isn't a drawing of those sort of things. This isn't a component diagram. This is a layer diagram. Right. The one above it is the one, like, where the controllers are. That's what's going to do that kind of stuff.
Starting point is 01:52:53 That's correct. Yeah. All right. So, then we have this whole notion of crossing boundaries. So, this is when they talk about the flow of control went from the controller through an application use case and then to the presenter. So they had this diagram that shows this. And what they're trying to show is from going between the layers, it starts in the controller, which was in that, not the bottom layer, but the one just above it. It goes from that.
Starting point is 01:53:26 Then it goes and calls into a use case, which is up in that second layer. The one that's not the entities at the top, but the one below it calls into a use case. And then that brings stuff back out into the presenter. So that's where it shows it moving up the chain and then coming back out and, and hooking that data in. Yeah. And, uh, we, once again, we're coming back to dependency inversion. We want those source code dependencies pointing in towards the use cases, not the other way out. We don't want those use cases to have ties into the outermost layer.
Starting point is 01:54:05 So that's where we're going to get around that with a dependency inversion, injecting those things in there one way or another. Yeah, I tried to spell this out here. I don't know. Let's see. So you have a use case, which is your second layer, right? That's not your top one, but that's the one right below your entities. It needs to call a presenter,
Starting point is 01:54:31 but you can't do that because your upper layer cannot call your bottom layer, right? It's not allowed to reach down and know about those detail, those implementation details. So they can't know about those outer circles. So the use case would then need to call an interface. It would basically have some sort of interface that it knows about. The implementation of that interface would be provided by the outer layer, or maybe in the case that you were just talking about, not that most outer layer, but that second one where the controllers and all those things live, that would be provided from there.
Starting point is 01:54:59 The interface adapters. The interface adapters. And that's how the dependency is inverted. So you have this use case that's depending on i what encrypt we'll call it we'll call it i encrypt right it doesn't know what is actually going to do that it's just going to be past something that fills in that contract so that controller is going to pass in let's call it a shaw 256 encrypt wait wait wait wait wait no let's not's call it a SHA-256 encryptor. No, wait, wait, wait, wait, wait, wait. No, let's not confuse that because in that case,
Starting point is 01:55:27 encrypt was our entity. Yeah. So our use case was going to be to take in like a reader or a writer. So the reader or writer, no, because that had to be at the entity level too. What was the thing? Set up a customer. Let's say set up a customer as a use case, right?
Starting point is 01:55:44 Set up a customer. Okay. So iCustomer. iCustomer. iCustomer is going to come in or iAccount, iNewAccount, something, whatever. It doesn't have any implementation that it can use, but it's going to be given an iCustomer object from down in the controller. And so that controller is going to be what knows what kind of iCustomer object
Starting point is 01:56:06 to create, be it a factory or some other type of mechanism. And it's going to give it to that use case layer. And that use case layer is going to be like, all right, I have this iAccount object now. Let's call.create on it, right? So iAccount.create. If everything passes, it doesn't know about the implementation it's just going to let that stuff flow back out and i think that's that that's that's inversion of control is literally again you mentioned earlier it doesn't have to be an interface it could have been an abstract class you could have had a base account right or or something that that polymorphism is affected by is really polymorphism man and you know what that's that's something that i honestly feel i
Starting point is 01:56:54 don't know about you guys but i feel they did such a disservice in in school is the whole talk about polymorphism was centered around making objects conform to it. But they never gave you a good reason why. Other than, hey, it's a roadmap. Like, that's literally the answer I was always given was, oh, well, you want, you know, if there's a click event that's available, then everything should have the term click event. And I was like, man, that seems kind of...
Starting point is 01:57:22 Right, it's about attaching behaviors to things. It's like, oh, just implement stuff. So you get work for free. Yeah. No, that's not really what that's for. That's not the purpose. And that's really where,
Starting point is 01:57:32 like, if you want to take polymorphism as what it, what it's very useful for, it's this, it's literally being able to flip things on its head and say, okay, instead of me dictating what's going to happen, how about you tell me here, here's the thing that you want me to use and I'll just use it
Starting point is 01:57:48 because I know how to use it, right? I mean, one case that I was thinking about this, again, in that use case example, that interface for the iCustomer is going to sit, the definition of the interface is going to sit next to the use case in terms of in terms of the levels here the implementation of the iCustomer interface will exist below that in that adapter interface or interface adapter level right and instead of you know one advantage of using the interface instead of a concrete class would be you could kind of have some a little bit more control over like how something has happened. So maybe if you wanted to say a name property, maybe it just returns back, um, a string as it is, or maybe it does some kind of computation to say like, Oh, you know what? I'm actually going to concatenate all of the, you know, the first name and the middle name and the last name,
Starting point is 01:58:39 uh, with a space in between, uh, you know, and if there's not a middle name, then I'll only have one space, right? Like, so it's going to, it's making those kinds of decisions, right? Like that's what that, that's an implementation detail in that interface adapter that is deciding. But because you only had an interface, you had a little bit more freedom in how you decided to make that, right? At least like in a C sharp world world because you could have that interface defined name as a property and you know yes technically behind the scenes it's going to create a method the same as what you might have to do in a class abstract class equivalent but you know at least from the syntactic sugar it's going to it's not going to look like that it's just going to look like that. It's going to look like one is just a simple property,
Starting point is 01:59:26 almost like a variable when in reality it's not. So data crossing the boundaries. This is getting into the areas that I was describing before about the DTO. So typically data crossing the boundaries consists of simple data structures, which I keep referring to as DTOs. Or POCOs or POJOs. A POCO has behavior though, right? No, no, no.
Starting point is 01:59:59 That's like a POCO or a POJO. That's a plain old Java class or Java object or a plain old C-sharp object, right? And I mean, when you think of those, when you think of a class, you typically think of something that has behavior, right? So this is where I guess it gets to be a little bit, I don't know, maybe it's a holy war, but I've definitely had disagreements with people where I'm like, no, no, no, a DTO is just a simple data transfer object. That's when it's just data only.
Starting point is 02:00:28 There's no behavior to it. When I think POCO or POJO, I think a class, an object that can have behavior to it. But that's irrelevant, at least to this point, as far as the data crossing. The point is that these are simple data structures. So if you're in a C world, for example, it just be a struck right that you're passing back and forth dto is more appropriate just looking at what some people define it here it's a dto is a class representing some data with no logic in it right that's what we're talking about a simple class it's it's a bag i've i've heard it as a bag of properties yep that. That's essentially what you've got.
Starting point is 02:01:06 Yeah, I just think that difference, like the only minor difference is just its intent. It's intended to be used to move data. Yeah. So I don't think that's a real important distinction. That's the only difference between that and Poco. So if I say DTL, I'm generally meaning this thing is going to travel. Yeah. poco so if i say dtl i'm generally meaning this thing is going to travel yeah so well but but the point here i'm trying to make though is that like going back to the c example like it doesn't have to be an object at all it doesn't have to be a
Starting point is 02:01:35 class it could be a struct right right it's just it's just as you know it could it could be a json object it's just some data that you're passing back and forth. Um, you know, God help you if you write it in XML. Right. I curse you, but I could validate it. Oh,
Starting point is 02:01:53 right. Everybody uses DTDs. Right. So this goes back to the conversation we had before about like not passing the entity objects. Right. So, or the,
Starting point is 02:02:03 or the data rows back and forth, right? So passing entity objects would be coming from the center of the circle out, or the data rows would be going the other direction, coming from the outside of the circle inwards, right? Or if you think back to our cone examples, the entity objects would be going down the cone towards the ground, and the data rows would be coming up towards cone uh towards the ground and the data rows
Starting point is 02:02:25 would be coming up towards the tip of the cone um ziggurat yep yeah or that made up word that joe keeps saying a wedding cake okay that's like a ziggurat okay okay i got it i know what you're talking about you're talking about like the mayan looking pyramids right yeah yeah i got you all right i'm there all right the ziggurat um yeah so so ideally we don't want to pass those around because then we are leaking uh a dependency if we do that and we want to keep we want to keep those dependencies isolated or insulated as i said earlier no you won't you won't yeah no he will don't do it you can do it don't don't do it but if you do do it just know that you're going to violate the dependency rules that we've described yeah so don't do it do it don't don't do it but get it done and just go ahead and do it. Yes. No, don't do it.
Starting point is 02:03:25 Do it. All right, so data is passed in the format that is most convenient to the inner circle. So if you are in the use case ring and you're trying to pass data to the entity, then you're going to pass something that the entity knows about. And this is where I was coming up with the idea of like, okay, well, that means that the entity has about. And this is where I was coming up with the idea of like, okay, well, that means that the entity has to define the interface.
Starting point is 02:03:48 It doesn't implement it, but it defines the interface or the abstract class that it expects the data to come in as, right? And similarly, from the use case, you know, ring, if it's coming from the controller, then the controller is going to pass the data to the use case in a way that the use case, you know, ring, if it's coming from the controller, then the controller is going to pass the data to the use case in a way that the use case knows. And that means that the use case has
Starting point is 02:04:10 defined the interface that it wants to be met, right? And these data structures, these are simple, they're isolated, they stay within their level. So this goes back to, I think Joe made the point about like, you know, hey, if you have this, this, these four layers, then you end up with these eight request response models, one per, you know, for each layer. Does that make sense? Yep. And when passing the data, it's,'s oh i already said that was in the form of the most um convenient so this is where it comes back to um you know again that the dto's
Starting point is 02:04:56 our dto this means that our dto's when crossing the boundaries they belong to that inner circle like that going back from the you know the if the entities is the most uh center circle and use cases is a ring outside of that then the entity knows the dto it has that definition of it but it sounds like just it sounds like each layer would have its own set of DTOs, request and response objects. And then to marshal things into a more abstract class, the lower level class, the one that is more detail or closer to the inputs and outputs is going to know how to translate that data
Starting point is 02:05:39 into that upper or inner layer. That is my understanding. Each layer would know how to do the translation to the next yep and you know the thing that works about that traffic cone example again like i kind of described this before was that that um when i said the cone touching the table like that it touching the ground is an interface right so like only the bottom part of that cone, which would be the outermost ring of the circle knows, uh, the details of touching the ground. Is the ground wet? Is it mud? Is it concrete? Is it tar? Right. Like as an example. Yep. Yeah. It's again, I think when we started all this, you know, there were a lot of things that were thrown out in terms of statements that they weren't clear. But I'm thinking, at least along the way, I know when I was reading all this, it started becoming a lot clearer.
Starting point is 02:06:39 Oh, yeah. As he got into all these ones. And I mean, we've talked about a lot of stuff. I mean, we're two hours and probably 15 minutes into this. So, you know, hopefully this is all making sense. I mean, like I said, just reading this book has given me a much stronger understanding of domain-driven design. I mean, that seems crazy. One book helped you understand the other. At the time, we even said that we wanted to go back and reread domain-driven
Starting point is 02:07:04 design after getting laid in the books. Like, okay, I'm starting to kind of get it. Let's go back. Yep. And so wrapping up this one, one of the things that he points out at the end of this particular section was conforming to the rules is not that difficult, but it does require you to mentally take it on, right? Like you have to be thinking about it as you're doing it. And if you do that, if you take the time to do it, then it'll set you have to be thinking about it as you're doing it. And if you do that, if you take the time to do it, then it'll set you up to be able to plug and play these things as you move along, which may not sound like much until you decide that, hey, my site's slow because my database is slow and we need to be able to plug in something to make it faster, right? Like having
Starting point is 02:07:41 those separations can really pay off dividends in the future with smaller pains. And because you're removing dependencies from the layers, then it makes things more testable. Yep. We've talked about testability being, you know, easier to maintain. It's more bulletproof. You feel more comfortable making changes, especially big changes, because you have tests to back up whether or not what you did worked or broke something. They give you confidence. Yes, that's the word I was trying to look for. Thank you. Yep. So that basically wraps up those sections here. I think we have a show summary, so we'll do that later. So resources, this chapter actually pretty much
Starting point is 02:08:22 sums up the whole book. I feel like it really ties in all the advice, kind of brings it all into one spot into one chapter. So if you only read one chapter in the book, let's say read this one and then kind of dive in. Skim your way back. Yeah, this did really kind of tie a bow on it. So obviously one of the resources we like is clean architecture. And don't forget, if you've made it this far,
Starting point is 02:08:42 that we do have a contest on this one. So if you go up there to this episode, episode 75 and leave us a comment on there, you can be entered for your chance to win your own paperback or Kindle version of the book. And I'll tell you, Uncle Bob is a lot more eloquent and well-spoken and organized than I am. Oh, man. If you liked what I had to say about it, you'll love Uncle Bob. Yes. Oh, man. All right.
Starting point is 02:09:10 So with that, it's my favorite part of the show, and that is the tip of the week. Yeah, and I'm going first here. I wanted to mention a kind of a problem that I ran into the other day, sending some emails. Had a real weird issue where certain email clients weren't getting image embeds.
Starting point is 02:09:24 If you've never done image embeds before, the concept is really simple. You basically send an attachment, but then you kind of tell the email like, hey, listen, that attachment, it really goes here. It's an image. And there were a couple of problems with it, but the main ones I was dealing with was actually on the iPhone. And back actually Outlook on both of those guys was being weird only on like iPhone and Mac. And so I thought it was this I thought was that I tried a bunch of different things. And it ended up being the stupid, stupidest problem in the world. I had a mime type with a period in it, which I know is wrong. It wasn't intended. It was just a bug, but it worked everywhere else. But not in these very specific things.
Starting point is 02:10:09 And actually, when I read into it too, I happened to notice that the MIME type for JPEG is JPEG. And it doesn't matter which extension you're using. That's always the correct, the MIME type. So I don't know if there's any good MIME type libraries out there. I'm sure there's like NuGet package, if you wanted to bring that in or you know an npm package or something but i just thought it's kind of interesting and if you've never dealt with mpeg with mine types before it's basically just a way of kind of classifying your data and saying
Starting point is 02:10:35 hey this is a bitmap image or this is a mp3 file or something there's actually a big list of like i think it's iso standards of what all the the ones are but you can't take it for granted. That's just going to be the file extension. And you definitely can't include that period. Nice tip. All right. So for mine, I'm going to give a team city tip here that I ran into where I discovered that if you had,'s say you have a Visual Studio solution that contains a lot of projects, and you only want to compile certain projects within that solution at a time to maybe have multiple configurations, and each one is just targeting a specific project
Starting point is 02:11:22 so that you don't have to build necessarily the entire solution, but only parts of it at a time that you care to build. Within TeamCity, you can set your target to be the project name and then do something like build or rebuild or clean or whatever. Say you have a project that's called my project name, you could say my project name, colon build, and it'll target just that one project name and build just that one project out of the entire solution. And you might have like, you know, 100 and 100 projects total in that solution, for example. But here's where the real problem came in. In my case, I had a project that had spaces in the name.
Starting point is 02:12:06 So it was my space project space name. And I wanted to build that. So thanks to our amazing Slack community, what I learned was if I did my percent percent 20 project, percent percent 20 project, percent percent 20 name, colon build, then team city would properly build just that one project out of the entire solution.
Starting point is 02:12:35 So it was crazy weird. It's not like I had to double encode the percent, but I basically had to escape the percent with a percent. So that's, that's how that worked. But I wanted to say thanks to, um, the, uh, Slack community, Critner, Sean, Robert, and Aztec that helped me, uh, figure that one out. Cause I was definitely stumbling on it and, uh, you know, big thanks to them. yeah our slight community is awesome truly yes and if you're not a part of it you should definitely uh join you can head to www.codingbox.net slash slack man what are you listening to over there yeah what is that are you playing a game? No. You lie.
Starting point is 02:13:25 You lie. Alright, so. Maybe we want to play. Yeah, exactly. Alright, so my tips. I don't understand. Is it my phone? Anyway, well.
Starting point is 02:13:39 Does it start? You really don't hear it? Whatever it was? It sounded like, almost like a cash register no not now yeah i definitely heard like he was definitely cashing in something because you'd hear the register ring every now and then yeah anyways all right so mine actually i have a few here two of them are basically the same so with this whole abstraction you get one i can't do it man these these are like state of consciousness as soon as they're gone they're gone so one is the common common logging
Starting point is 02:14:13 abstraction for dot net it's a new get package i have a link in here but it's really nice because along the lines of what we were talking about you don't want to leak your your implementations all the way into every layer of your thing and the common logging for abstract the common logging abstraction allows you to just have interfaces and abstractions that you can include in your projects and then whichever logging framework you want to choose whether it be log for net um oh wow there's one that you mentioned recently that was pretty good jo, that you said has been getting a lot of potential. Sir, sir, sir. Oh, yeah.
Starting point is 02:14:50 For you now, sir, sir, sir. Something like that. Yeah. There's also there's other ones and log whatever. But but the key is here, you can just include the interfaces, the abstractions, and it will work. So like that, my buddy, Will Madison had mentioned SLF4J previously back when we had talked about this a while back, and that's an abstraction
Starting point is 02:15:13 in Java for being able to do the same type thing. So I have a link for that one as well. And then the other thing I want to say is, so I think it was the last episode. I couldn't take it anymore. So we had the paperback version of, of clean architecture simply because that's all that was available when we started reading the book, if you guys remember correctly, some, you know, four score and 20 years ago. And I couldn't take it because I'm typically reading in the dark and I don't like having lights and stuff over me. And so I bought it for the Kindle, which was awesome because I could read it on my Kindle. And then when I was going to do the show notes the other night, I was like, wait a second, I don't need my Kindle next to me. You can read it on the web. So in case you didn't know,
Starting point is 02:15:58 you can go into your Amazon account. I mean, a lot of people probably do know, but if you don't go into your Amazon account, there's a under the the pull down over there where your orders and stuff are and there's a place for content you can go see all your kindle books in there and you can say open it up and read it on the web so you can have it as another tab in your browser so if you're wanting to read and do some research or whatever you don't have to have multiple devices sitting around to do it so that was my other tip. Well, you can also go to read.amazon.com. See, not everything.
Starting point is 02:16:31 No, not everything works there. And that's what's frustrating. I've tried that in the past. Some books won't load up on read.amazon.com. Why? I have no idea. But this one does. I have some books that didn't. but the one that, oh wait,
Starting point is 02:16:47 it did open it up in read.amazon. Okay, so now I take it back. You're correct. So I used to have books that wouldn't open up there. Read.amazon.com. We'll leave the link there. Oh wait, you removed one of your things because I had a note. Did I? I pasted the link
Starting point is 02:17:04 in for Sarah Log, which is logging but i might have deleted something i thought you were going to talk about um email addresses oh oh we were going to mention that too okay so this one's this one is sort of just a random thing that we were going to discuss because we started to before the show but it might be useful so i brought up one of my tips was going to be hey if if you have in your application where you're having to take in email addresses, a lot of people would just say string email and then have some sort of regex validator that they run against it that they copied and pasted from Stack Overflow. Right. There's another way.
Starting point is 02:17:39 There's a C sharp class called mail address. And I think it's in the system dot net dot. I don't remember what anymore here. I can tell you right now, the namespace, it is system.net.mail namespace. And it's called mail address. And this is a way that you can get validation, but it also breaks things out to where you can create an email address that
Starting point is 02:18:04 will give you back a host, a user, a display name, and an address. So, and you had thoughts. Specifically, what you were going to say was that if you wanted to use it as a way of verifying an address, if you try to pass in a string to it, it'll throw an exception if it's not a valid format so basically it was like a cheat to use that thing as a way of describe you know knowing whether or not the input was a valid email address or not so even if you don't want to send an email you just like new one up and see if it fails as instead of saying like mail message dot validate or something because there isn't like a validate method you just create a new one and see what happens yep and if it throws then you're good so just try catch the thing knew it and and you've got whether or not it's a real address or not so pretty cool so so one of the things that
Starting point is 02:18:55 we were talking about was like okay if you were going to um you know how might you do this if you were going to write it like kind of where you were coming from is like a lot of people just take that well i can do this myself kind of path and they'll try to write their own regular expression or something similar to that right now have you ever seen the official spec for that uh you mean the like the properties constructors all that or you mean for an email address for for validating an email oh yeah it's ridiculous and almost nothing does it right i'm gonna see if i can get this thing to cooperate with me here if i can do. Funny story while you're doing that. I had one of the VWs in the buyback program for Dieselgate, right?
Starting point is 02:19:51 And typically when I sign up for any kind of service, I usually use my Gmail plus and then whatever the name of it is. So it might be my email plus VW, you know, and that's because Gmail will allow you to do a plus and anything that you put after the plus will still get routed to your email account. But now you can set up filters for it, right? Man, I can't tell you how many times that's caused me a problem over, over the years, because what you're probably about the show is most people don't do email validation properly and on top of it they don't encode them properly so if they're doing get requests with them then that plus doesn't come in properly and it jacks up requests i literally had to go in and
Starting point is 02:20:38 hack the vw claim site to make my thing work because I used that email address. I had to troubleshoot the problem to a person on the phone and be like, yo, this isn't working because of this. Will you please go in and do X, Y, and Z. So here's, here's the thing.
Starting point is 02:20:58 The, the spec for RFC 5322 is insane. And you are insane. If you decide to write your own, you really shouldn't. And that's why you should use something like the mail address class that Alan was describing. So the worst offending went on here is definitely the Perl implementation. If you were to try to write a regular expression, and this only works says 99.99 of the time it'll work that's how crazy the the spec is for it um how many characters do you think the regular expression is for pearl um oh i feel like i knew this no don't don't don't looking it up Oh I feel like I knew this No don't look it up
Starting point is 02:21:46 I have no clue man I'm going to give you a link in a minute Oh my No way Oh man you looked I couldn't help it You're like a little kid man That's ridiculous
Starting point is 02:22:01 I'll put it like this I can't even count it I'll go ahead and share it with, uh, with Joe here. Uh, where's Joe at? There you go, Joe.
Starting point is 02:22:10 Now you can see what we're talking about. The Pearl regular expression to somewhat verify an email address. Most of the time is 6,499 characters long. And that's why you shouldn't try to roll your own. Man. And even then, it's only 99.99% of the time going to get it. That is insane. There is no 100% solution, is there?
Starting point is 02:22:37 It's basically just send an email, see what happens. Pretty much. Did it bounce? No. Right. Okay. Yeah, man. That is insanity right so if you think you got clever
Starting point is 02:22:49 and you wrote like a regular expression in your javascript that was like you know for some stuff and then at and some stuff and a dot and some stuff like you're gonna get 95 but you don't even have to have a dot in that last like you're gonna get 95 percent of the way there but you don't even have to have a dot in that last one do you i can't remember maybe not you're gonna handle uh yeah i'm gonna say that 99.9 percent of email doesn't do i mean don't like don't like definitely use the library don't get me wrong absolutely absolutely but maybe i'm telling you no just don't do this but if you're going to do it but don't do it go ahead and do it we'll approve it yeah so yeah definitely don't do it um but uh it's funny
Starting point is 02:23:34 that it's so complicated but like yet i feel like all three of us could easily like look at you know just about every address email address we've ever seen in our lives and been like thumbs up thumbs down with like 99.9% accuracy. You know, that's funny. You're probably right. You're probably right. Although there are some obscure rules that you just don't know about. If I go look for obscure email addresses, then I'm sure I could find some.
Starting point is 02:24:00 Yeah, man. So at any rate, yeah, the mail address class. If you didn't know about it and you do.NET development, C Sharp, VB, whatever, you know, be aware of it. It could help you out. Yeah, and don't be that person that has the weird address. Don't do it. Yeah, Alan.
Starting point is 02:24:16 Hey, man. I just tried to leverage what Google gave me, man. That's all I'm doing. With a weird address. The plus sign. I just leveraged it. All right. So, yeah, we've covered a lot in this show we're not gonna go over it again we went over it a lot we talked about stuff yeah uh screening architecture and use cases and policies and crossing boundaries and uh yeah so stuff and stuff. And with that,
Starting point is 02:24:45 we ask that you subscribe to us on iTunes, Stitcher and more using your favorite podcast app. If you happen to be listening to this because a friend might've pointed you to it or, uh, whatnot and be sure to give us a review by visiting www.codingblocks.net slash review. And while you're up there,
Starting point is 02:25:04 check out all our show notes, examples, discussions, and more. And send your feedback, questions, and rants to the Slack channel at codingblocks.slack.com. And be sure to follow us on Twitter at Coding Blocks or head over to codingblocks.net
Starting point is 02:25:17 and you'll find all our social links at the top of the page.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.