(https://i.postimg.cc/9fLnDqrv/Hacker5.jpg) (https://postimages.org/)
Hola buenos días a todo los que están leyendo, les vine a presentar algunas buenas prácticas que encontré mientras investigaba sobre php y me ayudaron a mejorar mis códigos.
1. Evitar anidar demasiado
Demasiadas declaraciones if-else puede resultar en un código difícil de leer.
Como no debería ser
function fibonacci(int $n)
{
if ($n < 50) {
if ($n !== 0) {
if ($n !== 1) {
return fibonacci($n - 1) + fibonacci($n - 2);
} else {
return 1;
}
} else {
return 0;
}
} else {
return 'Not supported';
}
}
Como sí debería ser
function fibonacci(int $n): int
{
if ($n === 0 || $n === 1) {
return $n;
}
if ($n > 50) {
throw new \Exception('Not supported');
}
return fibonacci($n - 1) + fibonacci($n - 2);
}
2. No agregar contexto innecesario a las variables
Si el nombre de la clase/objeto ya hace referencia a lo que es, no hay que repetirlo en las variables
Como no debería ser
class Car
{
public $carMake;
public $carModel;
public $carColor;
//...
}
Como sí debería ser
class Car
{
public $Make;
public $Model;
public $Color;
//...
}
3. Idealmente las funciones deben tener 2 o menos argumentos
Limitar la cantidad de argumentos es muy importante ya que facilita mucho las pruebas de las funciones. Si tienes más de tres argumentos tendrás que probar diferentes situaciones con cada argumento, lo cual se traduce a toneladas de pruebas
Una función sin argumento es lo ideal, uno o dos está bien, tres debe evitarse, más de tres deben consolidarse. Usualmente cuando una función tiene más de dos argumentos es porque está haciendo demasiadas cosas, en casos en donde es necesario se pasa un objeto como argumento
Como no debería ser
function createMenu(string $title, string $body, string $buttonText, bool $cancellable): void
{
// ...
}
Como sí debería ser
class MenuConfig
{
public $title;
public $body;
public $buttonText;
public $cancellable = false;
}
$config = new MenuConfig();
$config->title = 'Foo';
$config->body = 'Bar';
$config->buttonText = 'Baz';
$config->cancellable = true;
function createMenu(MenuConfig $config): void
{
// ...
}
4. Las funciones solo deben hacer una sola cosa
Esta una de las reglas más importante de todas, cuando las funciones hacen más de una cosa, se hace difícil de componer, testear, y razonarlo. Si una función hace una sola acción se puede refactorizar más fácilmente y se puede leer más claramente
Como no debería ser
function emailClients(array $clients): void
{
foreach ($clients as $client) {
$clientRecord = $db->find($client);
if ($clientRecord->isActive()) {
email($client);
}
}
}
Como sí debería ser
function emailClients(array $clients): void
{
$activeClients = activeClients($clients);
array_walk($activeClients, 'email');
}
function activeClients(array $clients): array
{
return array_filter($clients, 'isClientActive');
}
function isClientActive(int $client): bool
{
$clientRecord = $db->find($client);
return $clientRecord->isActive();
}
5. Encapsula las condicionales
Como no debería ser
if ($article->state === 'published') {
// ...
}
Como sí debería ser
if ($article->isPublished()) {
// ...
}
6. Evitar las condiciones
Esto parece una tarea imposible. Al escuchar esto por primera vez, la mayoría de la gente dice: "¿cómo se supone que debo hacer algo sin una declaración if?" La respuesta es que puede usar el polimorfismo para lograr la misma tarea en muchos casos. La segunda pregunta suele ser: "bueno, eso es genial, pero ¿por qué querría hacer eso?" La respuesta es un concepto de código limpio que aprendimos anteriormente: una función solo debe hacer una cosa. Cuando tienes y funciones que tienen declaraciones if, estas diciendo que la función hace más de una cosa. Recuerda, solo haz una cosa.
Como no debería ser
class Airplane
{
// ...
public function getCruisingAltitude(): int
{
switch ($this->type) {
case '777':
return $this->getMaxAltitude() - $this->getPassengerCount();
case 'Air Force One':
return $this->getMaxAltitude();
case 'Cessna':
return $this->getMaxAltitude() - $this->getFuelExpenditure();
}
}
}
Como sí debería ser
interface Airplane
{
// ...
public function getCruisingAltitude(): int;
}
class Boeing777 implements Airplane
{
// ...
public function getCruisingAltitude(): int
{
return $this->getMaxAltitude() - $this->getPassengerCount();
}
}
class AirForceOne implements Airplane
{
// ...
public function getCruisingAltitude(): int
{
return $this->getMaxAltitude();
}
}
class Cessna implements Airplane
{
// ...
public function getCruisingAltitude(): int
{
return $this->getMaxAltitude() - $this->getFuelExpenditure();
}
}
Espero que le haya gustado mi primer post y comenten sus opiniones
fuente: https://github.com/jupeter/clean-code-php (Ingles)
Muy buen aporte! Le voy a poner chincheta para que quede fijo al principio del foro de PHP.
Es muy muy útil
Muchas gracias!
ANTRAX
No tienes permitido ver los links.
Registrarse o Entrar a mi cuenta
Muy buen aporte! Le voy a poner chincheta para que quede fijo al principio del foro de PHP.
Es muy muy útil
Muchas gracias!
ANTRAX
muchas gracias!, me motiva para seguir haciendo más post
Una muy buena practica al momento de enredarse entre IFs son los operadores ternarios.
El operador ternario es un operador condicional que disminuye la longitud del código mientras realiza comparaciones y condicionales. Este método es una alternativa para usar sentencias if-else y anidadas if-else. El orden de ejecución para este operador es de izquierda a derecha.
un ejemplo rápido para que se entienda.
($var==$condicion?true:false);
Comparando esta simplificación con una condicional IF común, nos ahorramos muchas líneas de código a veces, innecesarias o engorrosas..
También podemos modificar la misma variable que utilizamos para que se cumpla la condición, cuando se cumple o no.
($var==$condicion?$var=$condicion++:$var=null);
Si les parece interesante puedo desarrollar un post acerca de este tema!
Saludos!
Cuidado con ese "==" los carga el diablo.
Genial sinceramente