← Extractions

Doctrine of Useful Objects — Scott Bellware at wroclove.rb 2023

Scott Bellware's wroclove.rb 2023 talk on the fundamentals of object-oriented design in Ruby. He introduces afferent/efferent coupling, distance from the main sequence, and the Doctrine of Useful Objects — walking through a sign-up example to demonstrate primitive initializers, class constructors as convenience interfaces, null-object dependencies via the Eventide `mimic` and `dependency` libraries, and why 'fat model, skinny controller' is a fundamental Rails design mistake.

Model
claude-opus-4-7
Ingestion
4eee1060
Input tokens
235,445
fresh
130,535
cached
91,514
cache write
13,396
Output tokens
14,594
Duration
223.1s
Roundtrips
6
Tool calls
17
Cost
$0.00
Nodes/edges extracted
25 / 49
Read set (nodes/edges)
119 / 2

Nodes (25)

update Doctrine of Useful Objects Separate Fact from Fiction in OOD talk
attrs {"type" => "talk"} {"date" => "2023-03-31", "type" => "talk"}
description Talk at wroclove.rb 2023. Scott Bellware's wroclove.rb 2023 talk. Opens with Rogers' adoption curve and Moore's 'crossing the chasm' to frame w...
short_description Talk at wroclove.rb 2023. Bellware's wroclove.rb 2023 talk on OOD fundamentals and the Doctrine of Useful Objects.
update Eventide project
description Collection of 30+ Ruby libraries co-founded by Scott Bellware and Nathan Ladd for implementing event-sourced, event-d... Collection of 30+ Ruby libraries co-founded by Scott Bellware and Nathan Ladd for implementing event-sourced, event-d...
short_description Ruby toolkit of 30+ libraries for event sourcing and event-driven autonomous services. Ruby toolkit of 30+ libraries for event sourcing and event-driven autonomous components.
create Eventide Summit 2023 event
kind (empty) event
name (empty) Eventide Summit 2023
slug (empty) eventide-summit-2023
attrs (empty) {"date" => "2023", "format" => "in-person", "location" => "British Columbia, Canada"}
description (empty) Eventide's first in-person summit / mini-conference, held in British Columbia, Canada in early 2023. The team used it...
short_description (empty) First Eventide in-person summit and contributor boot camp in British Columbia, Canada.
create Mimic tool
kind (empty) tool
name (empty) Mimic
slug (empty) mimic
attrs (empty) {"license" => "open-source", "category" => "library"}
description (empty) Library in the Eventide toolkit. When passed a class, `Mimic` returns an object that implements that class's interfac...
short_description (empty) Eventide Ruby library that builds inert null-object substitutes from any class's interface.
create Dependency tool
kind (empty) tool
name (empty) Dependency
slug (empty) dependency
attrs (empty) {"license" => "open-source", "category" => "library"}
description (empty) Library in the Eventide toolkit, built on top of Mimic. Provides a `dependency` macro that defines a null-coalescing ...
short_description (empty) Eventide Ruby library adding null-coalescing, diagnostic-substitutable dependency attributes.
create Initializer tool
kind (empty) tool
name (empty) Initializer
slug (empty) initializer
attrs (empty) {"license" => "open-source", "category" => "library"}
description (empty) Library in the Eventide toolkit. Provides an `initializer` macro that forces an object's initializer to be as primiti...
short_description (empty) Eventide Ruby library enforcing primitive initializers that only accept and record values.
create Afferent Coupling concept
kind (empty) concept
name (empty) Afferent Coupling
slug (empty) afferent-coupling
attrs (empty) {"category" => "pattern"}
description (empty) Inbound coupling — the number of other objects/units that call into a given object. Highly afferent objects (e.g. a R...
short_description (empty) Count of inbound calls into a unit of software from other units.
create Efferent Coupling concept
kind (empty) concept
name (empty) Efferent Coupling
slug (empty) efferent-coupling
attrs (empty) {"category" => "pattern"}
description (empty) Outbound coupling — the number of other objects/units a given object depends on. Highly efferent objects (e.g. contro...
short_description (empty) Count of outbound calls from a unit of software into other units.
create Distance From The Main Sequence concept
kind (empty) concept
name (empty) Distance From The Main Sequence
slug (empty) distance-from-the-main-sequence
attrs (empty) {"category" => "methodology"}
description (empty) Classical OO design metric (originating with Robert C. Martin) that plots an object's coupling (afferent ↔ efferent) ...
short_description (empty) Design metric plotting afferent/efferent coupling against generality/specialization.
create Crossing the Chasm concept
kind (empty) concept
name (empty) Crossing the Chasm
slug (empty) crossing-the-chasm
attrs (empty) {"category" => "methodology"}
description (empty) Geoffrey Moore's product-development model describing the difficulty of moving a technology from innovators/early ado...
short_description (empty) Moore's model of the gap between early adopters and the early majority in tech adoption.
create Rogers Adoption Curve concept
kind (empty) concept
name (empty) Rogers Adoption Curve
slug (empty) rogers-adoption-curve
attrs (empty) {"category" => "methodology"}
description (empty) Everett Rogers' diffusion-of-innovations curve: a normal distribution dividing a population into innovators, early ad...
short_description (empty) Bell-curve model of how technology moves through a population (innovators → laggards).
create Tell Don't Ask concept
kind (empty) concept
name (empty) Tell Don't Ask
slug (empty) tell-don-t-ask
attrs (empty) {"category" => "pattern"}
description (empty) Object-oriented principle: rather than asking an object for state and making decisions about it, tell the object what...
short_description (empty) Encapsulation principle: instruct objects to act rather than query their state.
create Single Responsibility Principle concept
kind (empty) concept
name (empty) Single Responsibility Principle
slug (empty) single-responsibility-principle
attrs (empty) {"category" => "pattern"}
description (empty) The 'S' in SOLID. A unit of software should be interested in doing one thing, so it only has to change in rare circum...
short_description (empty) A unit of software should have one purpose and therefore one reason to change.
create Liskov Substitution Principle concept
kind (empty) concept
name (empty) Liskov Substitution Principle
slug (empty) liskov-substitution-principle
attrs (empty) {"category" => "pattern"}
description (empty) Barbara Liskov's design principle: any two objects that implement the same interface are substitutable for one anothe...
short_description (empty) Barbara Liskov's rule: objects sharing an interface are interchangeable regardless of behavior.
update Useful Objects concept
description Object-oriented design doctrine associated with Scott Bellware (see 'Doctrine of Useful Objects: Separate Fact from F... Object-oriented design doctrine associated with Scott Bellware and the Eventide project. Core rules: an instantiated ...
short_description Scott Bellware's OOD doctrine about designing complete, downstream-serving objects. Bellware's OOD doctrine: objects must be operational the moment they are instantiated.
create Null Coalescing Attribute concept
kind (empty) concept
name (empty) Null Coalescing Attribute
slug (empty) null-coalescing-attribute
attrs (empty) {"category" => "pattern"}
description (empty) Pattern used in Eventide's Useful-Objects style: a getter defined as `@http_client ||= HttpClient::Substitute.new` (o...
short_description (empty) Attribute that lazily initializes to a default (often a null object) when still nil.
create Diagnostic Substitute concept
kind (empty) concept
name (empty) Diagnostic Substitute
slug (empty) diagnostic-substitute
attrs (empty) {"category" => "pattern"}
description (empty) Part of Eventide's Useful-Objects doctrine. A dependency is defaulted to an inert null-object implementation of its i...
short_description (empty) Designed-in null-object substitute with telemetry, used instead of mocks/stubs/spies.
create Class Constructor as Convenience Interface concept
kind (empty) concept
name (empty) Class Constructor as Convenience Interface
slug (empty) class-constructor-as-convenience-interface
attrs (empty) {"category" => "pattern"}
description (empty) Design pattern used in Eventide's Useful-Objects style: the instance-level initializer is kept primitive and mechanic...
short_description (empty) Pairing a primitive initializer with class-level factory methods for convenience and operational wiring.
create Give Unto Rails That Which Is Rails takeaway
kind (empty) takeaway
name (empty) Give Unto Rails That Which Is Rails
slug (empty) give-unto-rails-that-which-is-rails
attrs (empty) {"type" => "recommendation"}
description (empty) Bellware's guidance for Rails developers in the Doctrine of Useful Objects talk. Use Rails only for the web-server la...
short_description (empty) Keep business logic out of Rails and in lib/; treat Rails as a thin web-server layer.
create Rename app/models to app/data takeaway
kind (empty) takeaway
name (empty) Rename app/models to app/data
slug (empty) rename-app-models-to-app-data
attrs (empty) {"type" => "recommendation"}
description (empty) Heretical-but-deliberate Rails advice from Bellware's talk: rename `app/models` to `app/data` and do nothing with tho...
short_description (empty) Use ActiveRecord models only as scaffolded data carriers; put logic elsewhere.
create Fat Model Skinny Controller Is A Design Mistake takeaway
kind (empty) takeaway
name (empty) Fat Model Skinny Controller Is A Design Mistake
slug (empty) fat-model-skinny-controller-is-a-design-mistake
attrs (empty) {"type" => "warning"}
description (empty) Bellware's claim, provable via static-analysis of distance-from-the-main-sequence: 'fat model, skinny controller' is ...
short_description (empty) Concentrating business logic in models puts specific code on highly afferent objects.
create Classes Should Configure Their Own Dependencies takeaway
kind (empty) takeaway
name (empty) Classes Should Configure Their Own Dependencies
slug (empty) classes-should-configure-their-own-dependencies
attrs (empty) {"type" => "recommendation"}
description (empty) Bellware's closing Q&A position: a class should be responsible for configuring its own operational dependencies. Ther...
short_description (empty) Don't outsource operational dependency wiring to Rails config, IoC containers or needle.
create Ruby Hero Award 2019 resource
kind (empty) resource
name (empty) Ruby Hero Award 2019
slug (empty) ruby-hero-award-2019
attrs (empty) {"type" => "award", "year" => "2019"}
description (empty) The 2019 Ruby Hero Award for social impact, given to the Eventide project for its commitment to teaching and communit...
short_description (empty) 2019 Ruby Hero Award given to Eventide for social impact in teaching and community.
create Diagnostic Substitutes Are Not Mock Objects question
kind (empty) question
name (empty) Diagnostic Substitutes Are Not Mock Objects
slug (empty) diagnostic-substitutes-are-not-mock-objects
attrs (empty) {"answer_summary" => "Architecturally different: mocks retrofit transparency in the test file; diagnostic substitutes...
description (empty) Audience member pushes back that checking `http_client.posted?(content)` in a test looks exactly like a mock or a spy...
short_description (empty) Audience Q&A clarifying the difference between diagnostic substitutes and mocks/spies.
create Why Not Inject Dependencies Via Rails Configuration? question
kind (empty) question
name (empty) Why Not Inject Dependencies Via Rails Configuration?
slug (empty) why-not-inject-dependencies-via-rails-configuration
attrs (empty) {"answer_summary" => "No — by design. The class itself should own its operational dependency wiring; external IoC con...
description (empty) Audience member suggests the end-state design isn't very different from injecting the HTTP client through Rails confi...
short_description (empty) Q&A on using Rails config or IoC containers to wire operational dependencies.

Edges (49)

update Scott BellwareauthoredDoctrine of Useful Objects Separate Fact from Fiction in OOD
context (empty) Bellware delivered this talk at wroclove.rb 2023.
update Doctrine of Useful Objects Separate Fact from Fiction in OODpresented_atwroclove.rb 2023
context (empty) Single-speaker talk delivered at the 2023 edition of wroclove.rb.
update Scott Bellwareworks_onEventide
context Self-described co-founder of the Eventide project. Describes himself as co-founder of Eventide and actively leads its development.
create Scott Bellwareworks_onNeuron
context (empty) The Brightworks team including Bellware builds Neuron on top of Eventide for a venture-capital law firm.
relation (empty) works_on
source_node_id (empty) a230a950-7b3c-4b0a-a4d3-da2800c903bc
target_node_id (empty) 260a9dfc-8e5f-42d9-824e-21ed56b75e8a
update Scott Bellwareworks_atBrightworks
context Runs the North American consultancy that builds the Neuron product. Bellware runs Brightworks, which builds Neuron and stewards Eventide.
create Eventiderelated_toRuby Hero Award 2019
context (empty) Eventide won the 2019 Ruby Hero Award for social impact for its teaching and community engagement.
relation (empty) related_to
source_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
target_node_id (empty) 5b09ffcc-b714-440b-9e24-6ec0650d8fd5
create Scott BellwareattendedEventide Summit 2023
context (empty) Organized and attended Eventide's first in-person summit in British Columbia in early 2023.
relation (empty) attended
source_node_id (empty) a230a950-7b3c-4b0a-a4d3-da2800c903bc
target_node_id (empty) a889b85f-1780-47bf-be5d-531b37eb2de9
create Eventide Summit 2023aboutEventide
context (empty) The summit planned the next major version of Eventide and ran a contributor boot camp for the project.
relation (empty) about
source_node_id (empty) a889b85f-1780-47bf-be5d-531b37eb2de9
target_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
create Mimicrelated_toEventide
context (empty) Mimic is one of the libraries in the Eventide toolkit.
relation (empty) related_to
source_node_id (empty) 88573465-176c-412d-a7d9-75a861a8de68
target_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
create Dependencyrelated_toEventide
context (empty) Dependency is a library in the Eventide toolkit built on top of Mimic.
relation (empty) related_to
source_node_id (empty) ab9298e2-fa80-4bbe-99af-09bce8f6f6a8
target_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
create Initializerrelated_toEventide
context (empty) Initializer is a library in the Eventide toolkit providing primitive-initializer macros.
relation (empty) related_to
source_node_id (empty) cdc03ae1-2ecc-4bbe-be02-dd7ab5b4d478
target_node_id (empty) 702f4d95-01a7-4836-9562-8c14b01a4b73
create DependencyusesMimic
context (empty) Dependency's default substitute is a recordable Mimic instance — 'mimic plus plus'.
relation (empty) uses
source_node_id (empty) ab9298e2-fa80-4bbe-99af-09bce8f6f6a8
target_node_id (empty) 88573465-176c-412d-a7d9-75a861a8de68
create MimicaboutNull Object Pattern
context (empty) Mimic implements the null-object pattern: given a class, it returns an inert implementation of that class's interface.
relation (empty) about
source_node_id (empty) 88573465-176c-412d-a7d9-75a861a8de68
target_node_id (empty) d6326df9-ab4e-429e-b7b5-d8fc66ec0b52
update NeuronusesEventide
context Neuron is implemented as autonomous components on Eventide + MessageDB + Rails. All Neuron core logic runs on Eventide; Rails handles only the front end.
create NeuronusesRuby on Rails
context (empty) Neuron's front end is built in Rails while its core logic is Eventide.
relation (empty) uses
source_node_id (empty) 260a9dfc-8e5f-42d9-824e-21ed56b75e8a
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutUseful Objects
context (empty) The talk teaches the Doctrine of Useful Objects.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) c9dea571-60bc-4290-91c0-bfcb0dc4008d
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutAfferent Coupling
context (empty) Uses afferent coupling as one of the two coupling directions in the design-quadrant analysis.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 07d6482e-a1c8-43b8-b053-b89fc474675c
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutEfferent Coupling
context (empty) Uses efferent coupling as the outbound counterpart to afference.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 0eb6465e-4544-4965-acff-8c2bff59d5f1
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutDistance From The Main Sequence
context (empty) Introduces this classical OO metric as the grid underlying the happy/sad design quadrants.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) b806f058-0cd3-4742-b622-980672234fcd
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutCrossing the Chasm
context (empty) Opens by using the chasm to explain why OO knowledge rarely reaches the Rails majority.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) c8e658e7-0e95-4a89-babf-c9d54f401174
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutRogers Adoption Curve
context (empty) Frames the talk with Rogers' diffusion curve and the observation that ~70% of any population sits in the middle.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) f8dac7a7-49e2-4a6d-b5ab-dbce0804830b
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutTell Don't Ask
context (empty) Presents tell-don't-ask as an expression of encapsulation that reduces afferent coupling.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) c7c56b5d-5c31-40f9-bdc2-ff138a2c65b0
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutSingle Responsibility Principle
context (empty) Explains single-purpose objects as one of the design fundamentals, reframed as 'managing change'.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) aa71b064-e663-4a43-b25d-ea26e256fc27
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutLiskov Substitution Principle
context (empty) Justifies defaulting dependencies to inert substitutes by appealing to LSP ('is substitutable for').
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) ea8cfed2-a352-42bf-a655-c9e29734f7f3
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutNull Object Pattern
context (empty) Identifies Mimic substitutes as an implementation of the null-object pattern.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) d6326df9-ab4e-429e-b7b5-d8fc66ec0b52
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutDiagnostic Substitute
context (empty) Introduces diagnostic substitutes as the preferred alternative to mocks/stubs/spies in tests.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 515efcb3-4e12-40f3-96cf-cc1a91179075
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutNull Coalescing Attribute
context (empty) Walks through replacing a nil dependency with a null-coalescing attribute that defaults to a substitute.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 84e8021c-09c7-4c60-95e0-737484e31441
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutClass Constructor as Convenience Interface
context (empty) Final refactor pairs a primitive initializer with a class-level `build` constructor to separate convenience from mech...
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 5e0fa17b-74da-47d1-9075-b992f72d6e4f
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutMimic
context (empty) Demonstrates Eventide's Mimic library to build inert substitutes from a class's interface.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 88573465-176c-412d-a7d9-75a861a8de68
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutDependency
context (empty) Replaces the hand-written null-coalescing attribute with the `dependency` macro from Eventide's Dependency library.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) ab9298e2-fa80-4bbe-99af-09bce8f6f6a8
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutInitializer
context (empty) Uses Eventide's Initializer macro to enforce primitive initializers that only record values.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) cdc03ae1-2ecc-4bbe-be02-dd7ab5b4d478
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutFat Model Thin Controller
context (empty) Argues, using the distance-from-main-sequence quadrants, that fat-model-skinny-controller is a fundamental Rails desi...
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 0dee84c7-843e-481b-98eb-b6ee12dce2d8
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutTest Driven Development
context (empty) Argues TDD was never truly adopted in Rails because controllers weren't testable, and that applying TDD would have pr...
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 1c2ff90e-39e6-496e-b94d-6234d545033e
create Doctrine of Useful Objects Separate Fact from Fiction in OODaboutRuby on Rails
context (empty) Large parts of the talk and its Q&A focus on Rails-specific consequences and guidance.
relation (empty) about
source_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Useful Objectsrelated_toNull Coalescing Attribute
context (empty) Null-coalescing attributes are how Useful Objects default dependencies without nil-reference errors.
relation (empty) related_to
source_node_id (empty) c9dea571-60bc-4290-91c0-bfcb0dc4008d
target_node_id (empty) 84e8021c-09c7-4c60-95e0-737484e31441
create Useful Objectsrelated_toDiagnostic Substitute
context (empty) Useful Objects rely on diagnostic substitutes instead of mocks/stubs/spies.
relation (empty) related_to
source_node_id (empty) c9dea571-60bc-4290-91c0-bfcb0dc4008d
target_node_id (empty) 515efcb3-4e12-40f3-96cf-cc1a91179075
create Useful Objectsrelated_toClass Constructor as Convenience Interface
context (empty) Useful Objects separate the mechanical initializer from a class-level convenience constructor.
relation (empty) related_to
source_node_id (empty) c9dea571-60bc-4290-91c0-bfcb0dc4008d
target_node_id (empty) 5e0fa17b-74da-47d1-9075-b992f72d6e4f
create Fat Model Skinny Controller Is A Design Mistakefrom_talkDoctrine of Useful Objects Separate Fact from Fiction in OOD
context (empty) Extracted from Bellware's analysis of the design quadrants in the talk.
relation (empty) from_talk
source_node_id (empty) c67b587c-d5a2-4294-a4a0-962565ce7ff0
target_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
create Fat Model Skinny Controller Is A Design MistakeaboutFat Model Thin Controller
context (empty) The takeaway critiques the fat-model-skinny-controller convention.
relation (empty) about
source_node_id (empty) c67b587c-d5a2-4294-a4a0-962565ce7ff0
target_node_id (empty) 0dee84c7-843e-481b-98eb-b6ee12dce2d8
create Give Unto Rails That Which Is Railsfrom_talkDoctrine of Useful Objects Separate Fact from Fiction in OOD
context (empty) Recommendation from the Rails-specific guidance section of the talk.
relation (empty) from_talk
source_node_id (empty) 66eadfb7-3092-4c99-b958-ab687d3ca88f
target_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
create Give Unto Rails That Which Is RailsaboutRuby on Rails
context (empty) About how to integrate business logic with (or keep it away from) Rails.
relation (empty) about
source_node_id (empty) 66eadfb7-3092-4c99-b958-ab687d3ca88f
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Rename app/models to app/datafrom_talkDoctrine of Useful Objects Separate Fact from Fiction in OOD
context (empty) Advice given near the end of the talk on Rails folder structure.
relation (empty) from_talk
source_node_id (empty) cdcdbc0e-3c75-456f-bc68-6e4aa76833ba
target_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
create Rename app/models to app/dataaboutRuby on Rails
context (empty) Rails-specific structural recommendation.
relation (empty) about
source_node_id (empty) cdcdbc0e-3c75-456f-bc68-6e4aa76833ba
target_node_id (empty) 7aac705a-0987-49f2-b665-9d4e08a6acee
create Classes Should Configure Their Own Dependenciesfrom_talkDoctrine of Useful Objects Separate Fact from Fiction in OOD
context (empty) Stated in the Q&A exchange about IoC containers and Rails configuration.
relation (empty) from_talk
source_node_id (empty) e5e05ce7-9392-4caf-971f-56bb7cd55a39
target_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
create Classes Should Configure Their Own DependenciesaboutDependency Injection
context (empty) Takes a position on how dependency configuration should be done — inside the class, not via external frameworks.
relation (empty) about
source_node_id (empty) e5e05ce7-9392-4caf-971f-56bb7cd55a39
target_node_id (empty) 06941a97-6c62-4450-8f9a-16cf172f5dd8
create Diagnostic Substitutes Are Not Mock Objectsasked_atDoctrine of Useful Objects Separate Fact from Fiction in OOD
context (empty) Audience question during the talk's Q&A.
relation (empty) asked_at
source_node_id (empty) ce1183da-4e8e-4557-862a-426acb864336
target_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
create Diagnostic Substitutes Are Not Mock ObjectsaboutDiagnostic Substitute
context (empty) The question asks how diagnostic substitutes differ from mocks and spies.
relation (empty) about
source_node_id (empty) ce1183da-4e8e-4557-862a-426acb864336
target_node_id (empty) 515efcb3-4e12-40f3-96cf-cc1a91179075
create Why Not Inject Dependencies Via Rails Configuration?asked_atDoctrine of Useful Objects Separate Fact from Fiction in OOD
context (empty) Audience question during the talk's Q&A.
relation (empty) asked_at
source_node_id (empty) 75cba0a4-0e96-449b-85b9-28b320e0d54f
target_node_id (empty) a5efb987-8efd-40fd-9877-3b9c3e65421a
create Why Not Inject Dependencies Via Rails Configuration?aboutDependency Injection
context (empty) The question challenges whether external configuration is equivalent to in-class dependency wiring.
relation (empty) about
source_node_id (empty) 75cba0a4-0e96-449b-85b9-28b320e0d54f
target_node_id (empty) 06941a97-6c62-4450-8f9a-16cf172f5dd8

Read set

119 nodes

concept Fat Model Thin Controller search_nodes person Scott Bellware search_nodes tool ChatGPT search_nodes person Scott Bell search_nodes takeaway Name Things To Find Their Properties search_nodes tool RealtimeBoard search_nodes company SpaceX search_nodes concept GitHub Self-Hosted Runner search_nodes tool jq search_nodes takeaway Be kind and build useful things search_nodes takeaway Spoken Test Feedback with say + iTerm Triggers search_nodes project Eventide search_nodes tool TTY toolkit search_nodes takeaway Don't Cram Eventide Into Legacy Apps search_nodes takeaway Recommend Reading The Eventide Project search_nodes talk Introduction To Event Sourcing How To Use It With Ruby search_nodes tool Entity Store search_nodes question Can parts of Eventide, Rails Event Store and Trailblazer be combined in one project? search_nodes tool EventMachine search_nodes question Do Rails adopters write handlers instead of controller actions? search_nodes concept Event Store search_nodes resource Practical Object-Oriented Design in Ruby search_nodes question Does DDD require object-oriented programming? search_nodes tool Ruby search_nodes resource Object-Oriented Software Construction search_nodes takeaway Look outside Ruby for better patterns search_nodes concept Useful Objects search_nodes talk Doctrine of Useful Objects Separate Fact from Fiction in OOD search_nodes+get_node_edges concept Ruby Module Customization Mechanics search_nodes tool ROM search_nodes question How does naming an abstraction relate to OOP design? search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2018 search_nodes talk Mutation testing workshop wroclove.rb 2019 search_nodes talk Building LLM powered applications in Ruby search_nodes talk International cooperation in IT teams search_nodes concept Null Object Pattern search_nodes concept Fake Object search_nodes question Should fake implementations live with production code? search_nodes takeaway Encapsulation Via Function-Style Objects search_nodes concept Mock Third-Party Services Locally search_nodes concept Stubs over Mocks search_nodes takeaway Keep fake implementations out of production code search_nodes talk Webmock unmocked search_nodes concept Factory Cascades search_nodes talk Forms Are Dead: Building Agentic Workflows in Ruby search_nodes project Neuron search_nodes concept Checks, Tests, Reviews and Flags search_nodes question Cross-region business reporting aggregation search_nodes concept Application Logic vs Business Logic search_nodes project Petri Nets Performance Prediction Gem search_nodes takeaway Act as a perfect tool on reviews search_nodes project AlphaZero search_nodes concept Handwritten Incentive List and Action Plan search_nodes concept Open-Closed Principle search_nodes concept Dependency Injection search_nodes concept Structural Physics of Software search_nodes question Is the sufficient-funds check a feature envy smell? search_nodes takeaway Prefer conventions over custom code search_nodes concept Minimal Interface search_nodes takeaway Eliminate Primitives With Value Types search_nodes concept Boolean Flags as Implicit State search_nodes question How to detect coupling in a large existing project? search_nodes person Nathan Ladd search_nodes company Brightworks search_nodes company Transloadit search_nodes takeaway Add Fun to Keep Remote Workshops Human search_nodes tool Sync Space VR search_nodes talk Offline Sandwich Focus Workflow search_nodes question Turning Workshop Enthusiasm Into Real Results search_nodes concept Command Query Separation search_nodes question Isn't asking password confirmation business logic? search_nodes concept Opaque Dependencies search_nodes takeaway Prefer class-method services over stateful service objects search_nodes resource Rocket Real-Time Benchmark search_nodes question How to do DDD remotely? search_nodes concept Tethered Cat Fallacy search_nodes concept Flat Query Structure search_nodes concept Comfort With Layers search_nodes talk Adventures in durable execution search_nodes talk Development with axioms search_nodes talk Dealing With A Project's Complexity In A Changing Environment search_nodes takeaway Gradual migration via steps search_nodes concept Protocol Thinking search_nodes concept Domain Storytelling search_nodes concept Data-Dictated Development search_nodes concept DDD Whirlpool search_nodes concept Params-Driven Development search_nodes takeaway Introduce bounded-context controller namespaces search_nodes concept RAIL Performance Model search_nodes concept Command Form search_nodes concept Embrace The Evented Model search_nodes concept Immutable Form Runtime API search_nodes tool Reform search_nodes concept Namespace-Based Folder Hierarchy search_nodes concept Introduce Explaining Variable search_nodes concept Equivalent Mutation search_nodes tool Ruby on Rails search_nodes concept Cynefin Framework search_nodes event Rails World search_nodes project monolith framework search_nodes tool Ember.js search_nodes resource Woman on Rails search_nodes tool Rack search_nodes tool merb search_nodes takeaway Ruby as a Data Management Language search_nodes tool Discourse search_nodes concept Test Driven Development search_nodes concept Axiom-Driven Development search_nodes takeaway TDD Is Process And Philosophy, Not Mechanics search_nodes concept Rails Testing Pyramid (Ivan's version) search_nodes takeaway Avoid params-driven development search_nodes talk Ever shorter feedback loop search_nodes talk Testing Randomness search_nodes

2 edges