Se você renomear um método, ele não será mais sobrecarregado. Por si só, sobrecarregar não necessariamente torna o código menos legível, mas pode dificultar a implementação se a sintaxe não estiver clara.
Muitos idiomas usam a sobrecarga de método como um meio de apresentar uma interface para a funcionalidade em que os parâmetros podem ser opcionais e os padrões para os parâmetros opcionais estão implícitos. Isso é particularmente verdadeiro para idiomas que não suportam uma sintaxe de parâmetro padrão na declaração do método.
Então, fazendo isso:
void MyMethod(int param1, int param2 = 10)
{
...
}
evita que você faça isso:
void MyMethod(int param1)
{
MyMethod(param1, Param2Default);
}
void MyMethod(int param1, int param2)
{
....
}
Quanto ao que é mais legível, isso realmente se resume a você. Pessoalmente, prefiro a segunda opção, principalmente quando a lista de parâmetros está ficando um pouco longa, mas suponho que isso realmente não importa, desde que você seja consistente em toda a sua API.
A dificuldade com sobrecarga ocorre quando você deseja funções que fazem essencialmente a mesma coisa e onde deseja que a lista de parâmetros seja a mesma, mas os tipos de retorno sejam diferentes. A maioria dos idiomas não sabe diferenciar entre dois métodos com o mesmo nome, mas com tipos de retorno diferentes. Neste ponto, você precisa pensar em usar genéricos, alterar a interface do parâmetro ou renomear um dos seus métodos para indicar a diferença no tipo de retorno. É aqui que a legibilidade pode se tornar um grande problema, se você não optar por um esquema de nomeação simples e claro para lidar com situações como essa.
Nomear seus métodos sobrecarregados GetSomething()
e GetSomethingEx()
não vai dizer muito sobre quais são as diferenças entre seus métodos, principalmente se os tipos de retorno são as únicas diferenças entre eles. Por outro lado, GetSomethingAsInt()
e GetSomethingAsString()
conte um pouco mais sobre o que os métodos estão fazendo e, embora não sejam estritamente uma sobrecarga, indique que os dois métodos fazem coisas semelhantes, mas retornam tipos de valores diferentes. Eu sei que existem outras maneiras pelas quais você pode nomear métodos, no entanto, para fins de ilustração do argumento, esses exemplos grosseiros devem servir.
No exemplo dos OPs, a renomeação não é estritamente necessária porque os parâmetros do método são diferentes; no entanto, torna as coisas um pouco mais claras para nomear um método mais especificamente. No final, tudo se resume ao tipo de interface que você deseja apresentar aos seus usuários. A decisão de não sobrecarregar não deve ser tomada apenas com base em sua própria percepção de legibilidade. Os métodos de sobrecarga podem, por exemplo, simplificar uma interface de API e reduzir o número de métodos que um desenvolvedor pode precisar se lembrar; por outro lado, pode ofuscar a interface em um grau que exige que o desenvolvedor leia a documentação do método para entender qual formulário do método a ser usado, enquanto ter vários métodos com nomes semelhantes e descritivos pode torná-lo mais aparente apenas lendo um nome de método quanto à sua finalidade.