Claude-skill-registry acc-create-null-object
Generates Null Object pattern for PHP 8.5. Creates safe default implementations eliminating null checks. Includes unit tests.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/acc-create-null-object" ~/.claude/skills/majiayu000-claude-skill-registry-acc-create-null-object && rm -rf "$T"
manifest:
skills/data/acc-create-null-object/SKILL.mdsource content
Null Object Pattern Generator
Creates Null Object pattern infrastructure for eliminating null checks.
When to Use
| Scenario | Example |
|---|---|
| Optional dependencies | Logger, Cache, Notifier |
| Missing entities | Customer, User, Product |
| Feature toggles | Disabled feature returns null object |
| Default implementations | No-op defaults |
Component Characteristics
Interface
- Defines expected behavior
- Shared by real and null implementations
- Enables polymorphic usage
Null Object
- Implements interface with no-op behavior
- Returns neutral values
- Never throws on calls
Benefits
- Eliminates null checks
- Follows Liskov Substitution
- Simplifies client code
Generation Process
Step 1: Generate Interface
Path:
src/Domain/{BoundedContext}/
— Interface with{Name}Interface.php
methodisNull()
Step 2: Generate Null Object
Path:
src/Domain/{BoundedContext}/
— Null implementation returning neutral valuesNull{Name}.php
Step 3: Generate Real Implementation
Path:
src/Domain/{BoundedContext}/
— Real implementation with business logic{Name}.php
Step 4: Generate Tests
— Null object behavior testsNull{Name}Test.php
File Placement
| Component | Path |
|---|---|
| Interface | |
| Null Object | |
| Real Implementation | |
| Unit Tests | |
Naming Conventions
| Component | Pattern | Example |
|---|---|---|
| Interface | | |
| Real Implementation | | |
| Null Object | | |
| Test | | |
Neutral Return Values
| Type | Neutral Value |
|---|---|
| (empty string) |
| |
| |
| |
| |
| No return |
| Object | Empty/default instance |
| Collection | Empty collection |
Quick Template Reference
Interface
interface {Name}Interface { public function {method1}(): {returnType1}; public function {method2}({params}): {returnType2}; public function isNull(): bool; }
Null Object
final readonly class Null{Name} implements {Name}Interface { public function {method1}(): {returnType1} { return {neutralValue1}; } public function isNull(): bool { return true; } }
Real Implementation
final readonly class {Name} implements {Name}Interface { public function __construct({properties}) {} public function {method1}(): {returnType1} { return {realImplementation}; } public function isNull(): bool { return false; } }
Usage Example
Repository Returning Null Object
final readonly class DoctrineCustomerRepository implements CustomerRepositoryInterface { public function findById(CustomerId $id): CustomerInterface { $row = $this->connection->fetchAssociative( 'SELECT * FROM customers WHERE id = :id', ['id' => $id->toString()] ); if ($row === false) { return new NullCustomer(); } return $this->hydrate($row); } }
Client Code Without Null Checks
final readonly class CreateOrderUseCase { public function execute(CreateOrderCommand $command): Order { $customer = $this->customers->findById($command->customerId); // No null check needed - NullCustomer returns 0.0 $discount = $customer->getDiscount(); $order = Order::create( customerId: $customer->id(), items: $command->items, discount: $discount ); return $order; } }
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|---|---|
| Throwing in Null | Unexpected exceptions | Return neutral values |
No | Can't detect null object | Add isNull method |
| Different Interface | LSP violation | Same interface as real |
| Side Effects | Unexpected behavior | Pure no-op methods |
| Complex Logic | Not a null object | Keep simple and neutral |
References
For complete PHP templates and examples, see:
— Interface, NullObject, Real Implementation, NullLogger, NullCache templatesreferences/templates.md
— NullCustomer, NullNotifier, Repository integration examples and testsreferences/examples.md