TL;DR: How to avoid getters
Getting things is widespread and safe. But it is a very bad practice.
-
Naming
-
Information Hiding
-
Coupling
-
Encapsulation Violation
-
Mutability
-
Anemic Models
-
Avoid Getters
-
Use domain names instead
-
Protect your implementation decisions.
<?php
final class Window {
public $width;
public $height;
public $children;
public function getWidth() {
return $this->width;
}
public function getArea() {
return $this->width * $this->height;
}
public function getChildren() {
return $this->children;
}
}
<?
final class Window {
private $width;
private $height;
private $children;
public function width() {
return $this->width;
}
public function area() {
return $this->height * $this->width;
}
public function addChildren($aChild) {
// Do not expose internal attributes
return $this->children[] = $aChild;
}
}
Getters coincide in certain scenarios with a true responsibility. It will be reasonable for a window to return its color and it may accidentally store it as color. so a color() method returning the attribute color might be a good solution.
getColor() breaks bijection since it is implementative and has no real counterpart on our mappers.
Most linters can warn us if they detect anemic models with getters and setters.
- Information Hiding
Getters and Setters are a bad established practice. Instead of focusing on object behavior (essential), we are desperate to know object guts (accidental) and violate their implementation.
Code Smell 64 - Inappropriate Intimacy
Code Smell 109 - Automatic Properties
Code Smell 146 - Getter Comments
Nude Models - Part II: Getters
Photo by Vidar Nordli-Mathisen on Unsplash
The value of a prototype is in the education it gives you, not in the code itself.
Alan Cooper
Software Engineering Great Quotes
This article is part of the CodeSmell Series.