Regra
Uma classe por ficheiro.
Várias classes em a único ficheiro criar código
organização pouco clara e mais difícil de navegar.
Idiomas suportados: 45+Introdução
Colocar várias classes num único ficheiro dificulta a localização de classes específicas quando se navega numa base de código. Os desenvolvedores que procuram por Repositório de utilizadores não o encontrará rapidamente se estiver enterrado num ficheiro chamado base de dados.js juntamente com outras cinco classes. Isto viola o princípio da menor surpresa e atrasa o desenvolvimento, uma vez que os membros da equipa perdem tempo à procura de definições de classes.
Porque é importante
Manutenção do código: A existência de várias classes por ficheiro cria limites pouco claros entre as responsabilidades. Quando uma classe precisa de ser modificada, os programadores têm de abrir um ficheiro que contém classes não relacionadas, aumentando a carga cognitiva e o risco de modificar acidentalmente o código errado.
Navegação e capacidade de descoberta: Os IDE e os editores de texto têm dificuldade em fornecer uma definição exacta de "ir para" quando várias classes partilham um ficheiro. Os programadores perdem tempo a procurar nos ficheiros em vez de irem diretamente para a classe de que necessitam. Isso se agrava em grandes bases de código com centenas de classes.
Conflitos de controlo de versões: Quando várias classes partilham um ficheiro, as alterações a diferentes classes por diferentes programadores criam conflitos de fusão. Os ficheiros separados permitem o desenvolvimento paralelo sem sobrecarga de coordenação, uma vez que cada programador trabalha no seu próprio ficheiro.
Exemplos de código
Não conforme:
// database.js
class UserRepository {
async findById(id) {
return db.users.findOne({ id });
}
}
class OrderRepository {
async findByUser(userId) {
return db.orders.find({ userId });
}
}
class ProductRepository {
async findInStock() {
return db.products.find({ stock: { $gt: 0 } });
}
}
module.exports = { UserRepository, OrderRepository, ProductRepository };
Porque é que é errado: Três classes de repositório não relacionadas num ficheiro chamado base de dados.js. Procurar por Repositório de encomendas requer saber que está em base de dados.js em vez de OrderRepository.js. As alterações de ficheiros afectam várias classes, criando conflitos de fusão desnecessários.
Conformidade:
// UserRepository.js
class UserRepository {
async findById(id) {
return db.users.findOne({ id });
}
}
module.exports = UserRepository;
// OrderRepository.js
class OrderRepository {
async findByUser(userId) {
return db.orders.find({ userId });
}
}
module.exports = OrderRepository;
// ProductRepository.js
class ProductRepository {
async findInStock() {
return db.products.find({ stock: { $gt: 0 } });
}
}
module.exports = ProductRepository;
Porque é que isto é importante: Cada classe no seu próprio ficheiro torna a navegação previsível. Os IDEs podem saltar diretamente para OrderRepository.js ao procurar a classe. As alterações a um repositório não afectam os outros, eliminando conflitos de fusão desnecessários.
Conclusão
Dê aos ficheiros o nome da classe que contêm para uma navegação previsível. Esta convenção pode ser usada em grandes bases de código, onde é importante encontrar classes específicas rapidamente. Os ficheiros extra valem a pena pela clareza organizacional que proporcionam.
.avif)
