Injectables vs. Newables
Injectables vs. Newables
Injectable Violation
<?php
class Warehouse
{
private $productRepository;
public function __construct(ProductRepository $productRepository)
{
$this->productRepository = $productRepository;
}
public function pickItem($id, $count)
{
// ...
}
}
<?php
class Warehouse
{
private $productRepository;
private $pickedItems = [];
// ...
public function pickItem($id, $count)
{
$productDetails = $this->productRepository->find($id);
$this->pickedItems[] = new Pick($productDetails, $count);
}
public function getPicks()
{
return $this->pickedItems;
}
}
<?php
class Warehouse
{
private $productRepository;
public function pickItem($id, $count)
{
$productDetails = $this->productRepository->find($id);
return new Pick($productDetails, $count);
}
}
// ...
$picks[] = $warehouse->pickItem(23, 5);
$pickCollection = new PickCollection();
// ...
$pickCollection->add($warehouse->pickItem(23, 5));
Newable Violation
class ProductDetails
{
private $title;
private $availableInCountries = [];
// ...
public function getTitle()
{
return $this->title;
}
public function isAvailableIn($countryCode)
{
return in_array($countryCode, $this->availableInCountries);
}
}
class ProductDetails
{
// ...
public function __construct(DatabaseConnection $connection /* ... */)
{
$this->connection = $connection;
}
public funtcion save()
{
// ... prepare SQL ...
$statement = $this->connection->prepare($sql);
// ... bind parameters ...
$statement->execute();
}
}
class CodeDetailsRepository
{
public function __construct(DatabaseConnection $connection /* ... */)
{
$this->connection = $connection;
}
public funtcion save(ProductDetails $product)
{
// ... prepare SQL ...
$statement = $this->connection->prepare($sql);
// ... bind parameters ...
$statement->execute();
}
}
Comments
Post a Comment