← 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 Bellware → authored → Doctrine 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 OOD → presented_at → wroclove.rb 2023
context (empty) → Single-speaker talk delivered at the 2023 edition of wroclove.rb.
update Scott Bellware → works_on → Eventide
context Self-described co-founder of the Eventide project. → Describes himself as co-founder of Eventide and actively leads its development.
create Scott Bellware → works_on → Neuron
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 Bellware → works_at → Brightworks
context Runs the North American consultancy that builds the Neuron product. → Bellware runs Brightworks, which builds Neuron and stewards Eventide.
create Eventide → related_to → Ruby 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 Bellware → attended → Eventide 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 2023 → about → Eventide
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 Mimic → related_to → Eventide
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 Dependency → related_to → Eventide
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 Initializer → related_to → Eventide
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 Dependency → uses → Mimic
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 Mimic → about → Null 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 Neuron → uses → Eventide
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 Neuron → uses → Ruby 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 OOD → about → Useful 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 OOD → about → Afferent 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 OOD → about → Efferent 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 OOD → about → Distance 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 OOD → about → Crossing 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 OOD → about → Rogers 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 OOD → about → Tell 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 OOD → about → Single 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 OOD → about → Liskov 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 OOD → about → Null 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 OOD → about → Diagnostic 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 OOD → about → Null 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 OOD → about → Class 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 OOD → about → Mimic
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 OOD → about → Dependency
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 OOD → about → Initializer
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 OOD → about → Fat 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 OOD → about → Test 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 OOD → about → Ruby 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 Objects → related_to → Null 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 Objects → related_to → Diagnostic 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 Objects → related_to → Class 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 Mistake → from_talk → Doctrine 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 Mistake → about → Fat 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 Rails → from_talk → Doctrine 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 Rails → about → Ruby 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/data → from_talk → Doctrine 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/data → about → Ruby 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 Dependencies → from_talk → Doctrine 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 Dependencies → about → Dependency 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 Objects → asked_at → Doctrine 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 Objects → about → Diagnostic 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_at → Doctrine 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? → about → Dependency 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