Main Points
- Minimize initial arguments with defaults
- Option to getBurger() at any point in the process
I liked Nishan's Burger Builder article. It utilizes patterns I have been using for years. But it seems I only utilized this chaining pattern with classes and rarely otherwise. Lately I have not been using the class keyword for more functional style of programming. If I had to create a burger builder in the app I'm currently working on at the very moment, here is what it would look like.
'use strict' const burger = (opts = {}) => { let { size = 14, cheese = false, pepperoni = false, lettuce = false, tomato = false } = opts const getBurger = () => Object.assign({},{ size, cheese, pepperoni, lettuce, tomato }) const add = topping => ({ 'cheese': () => cheese = true, 'pepperoni': () => pepperoni = true, 'lettuce': () => lettuce = true, 'tomato': () => tomato = true }[topping]()) return { getBurger, add } } const myBurger = burger(14) myBurger.add('cheese') myBurger.add('lettuce') myBurger.add('tomato') myBurger.add('pepperoni') console.log(myBurger.getBurger())
Top comments (2)
Cool. Thanks for referencing my post.
But it all boils down to use casesโ in the end.
Using a separate builder class enforces the immutability I suppose. The way I see is: it abstracts the object creation effectively.
I would always avoid stringly-typed interfaces. Neither the compiler nor any other tool can check the correctness of your calls.
I also think that both of you are overthinking things. Having a class that needs more than 5 things fed to its constructor is a big red flag and might be your real problem. I'm pretty sure you only use a few of all the possible combinations of objects.
If this is about dependency injection I always use a dependency structure that keeps all needed dependencies and can be passed as one parameter.