O truque é que você não precisa escolher. Uma coisa legal que muitos ORMs fornecem (por exemplo, o do Django, Squeryl, SQLAlchemy e mais) são consultas compostas. Ou seja, você pode não apenas consultar uma tabela, mas consultar os resultados de outra consulta. Isso não é tão caro quanto parece, já que o otimizador de consultas ORM ou DB pode reduzi-lo a um SELECT combinado.
Então você acabaria com algo como (exemplo do Django)
class Article:
@staticmethod
def posts():
return Article.objects.all()
@staticmethod
def author_posts(author):
return Article.posts().filter(author=author)
Lá você tem - dois métodos separados e sem repetição. : -)
Quando você tem que escolher entre limpa e reutilizável, muitas vezes há uma terceira opção: um pouco mais sofisticada, mas limpa e reutilizável.
(By the way, os métodos estáticos existem apenas para imitar sua estrutura. Na verdade, um teria métodos de instância na classe Gerenciador de artigos. Também devo acrescentar que este é um exemplo trivial, como o gerenciador padrão - denominado Article.objects
- já fornece o método all
para recuperar todos os resultados, mas esse não é o ponto - o ponto é que você obteve um resultado mais específico, consultando um conjunto de resultados maior.