{"id":20416228,"url":"https://github.com/carlosruesta/php-object-calisthenics","last_synced_at":"2026-05-18T15:04:52.922Z","repository":{"id":117119959,"uuid":"361687257","full_name":"carlosruesta/php-object-calisthenics","owner":"carlosruesta","description":"Object Calisthenics com PHP","archived":false,"fork":false,"pushed_at":"2021-04-30T00:12:17.000Z","size":53,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-05T03:42:24.848Z","etag":null,"topics":["best-practices","lei-de-demeter","object-calisthenics","php","phpunit","poo"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/carlosruesta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-26T09:12:43.000Z","updated_at":"2021-05-10T09:24:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"b7582a37-2298-41d8-b715-bf577def8aed","html_url":"https://github.com/carlosruesta/php-object-calisthenics","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/carlosruesta/php-object-calisthenics","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosruesta%2Fphp-object-calisthenics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosruesta%2Fphp-object-calisthenics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosruesta%2Fphp-object-calisthenics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosruesta%2Fphp-object-calisthenics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/carlosruesta","download_url":"https://codeload.github.com/carlosruesta/php-object-calisthenics/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/carlosruesta%2Fphp-object-calisthenics/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274744062,"owners_count":25341136,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-12T02:00:09.324Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["best-practices","lei-de-demeter","object-calisthenics","php","phpunit","poo"],"created_at":"2024-11-15T06:19:12.057Z","updated_at":"2026-05-18T15:04:47.881Z","avatar_url":"https://github.com/carlosruesta.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# php-object-calisthenics\n\n## Setup do projeto\n\n* Precisei rodar o composer update\n* Precisei ativar o PECL dentro do PHP Storm\n* Precisei baixar a DLL da extensão DS na versão 1.3.1 própria para o PHP 7.4\n* Adicionei a DLL na pasta [ext] da instalação do PHP 7.4\n* Adicionei no php.ini a extensão: extension=ds\n\t* https://github.com/php-ds/ext-ds\n\t*  A extensão serve para ampliar as capacidades do PHP com estruturas de dados mais modernas como Map;\n\n\n## Aula 01\n\n### 1.- Não use getters e setters\n###\t1.1- Tell, don't ask\n\nUtilizar métodos de acesso a nossas propriedades faz sentido, desde que nós não utilizemos o retorno para tomar decisões que poderiam estar encapsuladas na classe.\n\nEvite usar setters sempre que possível. Dessa forma você terá **OBJETOS IMUTÁVEIS**, ou seja, que não sofrem alteração. \n\nEsta técnica ajuda bastante na previsibilidade de seu código.\n\nCom isso aprendemos a primeira regra deste treinamento: Nunca use (ou pelo menos evite) getters e setters.\n\n## Aula 02\n\n### 2.- Nunca use ELSE\n### 2.1\tEarly return\n### 2.2 Fail fast\n\nExiste uma métrica muito famosa para saber quão complexo nosso código está. O nome desta métrica é Complexidade Ciclomática.\n\nO cálculo dessa métrica é relativamente complexo, mas basicamente, quanto mais ifs e elses, mais complexo nosso método. Esse cálculo nos diz quantos possíveis caminhos nosso código pode percorrer.\n\nAo evitar o uso de else, nós escrevemos códigos com uma Complexidade Ciclomática menor.\n\n## Aula 03\n\n### Envolva seus tipos primitivos, caso eles tenham comportamento \n\n### Sobre herança\nHerança é um ótimo recurso da programação orientada a objetos, mas deve ser usado com parcimônia.\nNeste link há um exemplo de usos incorretos deste princípio: https://blog.caelum.com.br/como-nao-aprender-orientacao-a-objetos-heranca/amp/\nNós não queremos expor todas as funcionalidades de um mapa através de nossa classe WatchedVideos. Queremos apenas adicionar vídeos e pegar a data do mais antigo. Sendo assim, nossa classe deve TER um mapa, e não SER um.\n\n## Aula 04\n\n### Apenas um operador de acesso por instrução. Apenas uma setinha.\n* Com isso aqui vamos favorecer o encapsulamento.\n* Lei de Demeter: não fale com estranhos. Só falar com nossos atributos. \n* Exceção à regra: Interface fluente. Aquela que permite chamar os métodos da classe encadeados.\n\tMas o método encadeado da classe tem que ser um método que faz sentido chamar de forma encadeada. \n\n### Não abrevie nunca os nomes\n* Motivos para abreviar:\n\t+ classe/método/variável/atributo/objeto muito usado em vários lugares\n\t+ o conteúdo faz muita coisa e preciso dar um nome composto\n\n* Reforçamos, novamente, o princípio Tell, Don’t Ask\n* Conhecemos a lei de Demeter\n* Vimos que dar nomes pode ser uma tarefa difícil\n* Aprendemos 2 regras de Object Calisthenics\n\t+ Tenha apenas 1 ponto (operador de acesso de objetos) por linha (instrução)\n\t+ Não abrevie (nunca)\n\t\n## Aula 05\n\n### Reduza o número de propriedades por método\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarlosruesta%2Fphp-object-calisthenics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarlosruesta%2Fphp-object-calisthenics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarlosruesta%2Fphp-object-calisthenics/lists"}