Якщо ви перейменовуєте метод, він більше не буде перевантажений. Сама по собі перевантаження не обов'язково робить код менш читабельним, однак це може ускладнити виконання, якщо синтаксис не зрозумілий.
Багато мов використовують перевантаження методу як засіб представлення інтерфейсу для функціоналу, де параметри можуть бути необов’язковими, а за замовчуванням для необов'язкових параметрів маються на увазі. Особливо це стосується мов, які не підтримують синтаксис параметрів за замовчуванням у декларації методу.
Отже, роблячи це:
void MyMethod(int param1, int param2 = 10)
{
...
}
рятує вас від цього:
void MyMethod(int param1)
{
MyMethod(param1, Param2Default);
}
void MyMethod(int param1, int param2)
{
....
}
Що стосується того, що можна читати, то справді зводиться до вас. Особисто я віддаю перевагу другому варіанту, особливо коли список параметрів стає дещо довгим, але я вважаю, що він насправді не має значення, поки ви послідовні протягом усього API.
Труднощі з перевантаженням виникають, коли ви хочете, щоб функції, які по суті виконують те саме, і коли ви хочете, щоб списки параметрів були однаковими, але типи повернення були різними. Більшість мов не знають, як розрізняти два методи, названі однаковими, але з різними типами повернення. На цьому етапі вам потрібно подумати над використанням дженерики, зміною інтерфейсу параметрів або перейменуванням одного з ваших методів, щоб вказати різницю у типі повернення. Ось тут читабельність може стати великою проблемою, якщо ви не вирішитеся на простій і зрозумілій схемі іменування для вирішення подібних ситуацій.
Іменування перевантажених методів GetSomething()
і GetSomethingEx()
не збирається багато говорити про те, які відмінності між вашими методами, особливо якщо єдині відмінності між ними є саме типи повернення. З іншого боку, GetSomethingAsInt()
і GetSomethingAsString()
розкажіть вам трохи більше про те, що роблять методи, і, хоча не є суворо перевантаженим, вказуйте на те, що два методи роблять подібні речі, але повертають різні типи значень. Я знаю, що існують і інші способи, якими ви могли б назвати методи, однак для того, щоб проілюструвати суть, ці грубі приклади повинні робити.
У прикладі ОП перейменування не є суворо необхідним, оскільки параметри методу різні, однак це робить дещо зрозумілішим назву методу конкретніше. Зрештою, це дійсно зводиться до типу інтерфейсу, який ви хочете представити своїм користувачам. Рішення про те, чи не перевантажувати, не повинно прийматися виключно на основі власного сприйняття читабельності. Методи перевантаження можуть, наприклад, спростити інтерфейс API і зменшити кількість методів, про які розробник може запам'ятати, з іншого боку, він може заплутати інтерфейс до такої міри, яка потім вимагає від розробника ознайомитися з документацією методу, щоб зрозуміти, у якій формі використовуваного методу, тоді як наявність ряду подібних, але описово названих методів може зробити більш очевидним лише читання назви методу щодо його мети.