Що поганого у поверненні хештелю з публічного методу і коли це має сенс робити?


9

Які проблеми із дизайном при поверненні хештелю з публічного методу, коли ви хочете повернути кілька елементів замість створення класу та повернення цього об’єкта?

Якщо у нього виникають проблеми, то при яких обставинах має сенс це робити?

Як змінюється відповідь на це питання залежно від того, динамічна мова чи ні?

Редагувати: Це для уточнення того, що ключі були б постійними і є частиною коду, а не даними. Щось, для чого ми зазвичай створюємо клас. Питання в тому, чому було б неправильно використовувати хештел замість того, якщо створення класу дійсно здається правильним вибором.

Відповіді:


11

Використовуйте краще визначений клас як тип повернення, ніж хеш-таблицю, яка містить довільну кількість значень як пар імен / значень.

  1. Перший і головний найважливіший момент - - ремонтопридатність. Дивлячись на код, новий програміст ніколи не може сказати, які значення повертає метод. Якщо нова людина не розуміє цього, дивлячись на код, код не стане корисним і схильним до помилок, коли хтось збирається додати більше даних / значень до цих даних або покращити додаток.

  2. Методи - це договори між абонентом та службою. Найголовніше в методі - це їх введення та вихід. Цей вхід і вихід повинен бути легко читабельним, зрозумілим і самостійно документувати. Якщо ви використовуєте клас Person як повернене значення, яке має ім'я, прізвище, вік - це самодокументування. Якщо ви генеруєте для цього Javadoc, користувач може переходити між класами, щоб краще зрозуміти це. Якщо ви користуєтеся хештелем, вам доведеться або пояснити його в коментарях, які ніхто не буде читати або оновлювати, коли все зміниться.

  3. Ви не можете використовувати дженерики, як, HashMap<String,String>на випадок, якщо ви хочете додати число (скажімо, вік) до оператора return. Якщо ви не використовуєте дженерики, вам доведеться переводити об'єкт вперед і назад до фактичного типу. Ви можете зберегти це, якщо використовуєте динамічне введення тексту.

  4. Крім того, є більше шансів на збій часу виконання, ніж пошук проблем у процесі компіляції. Наприклад, якщо хтось видаляє запис з хешмапу, і хтось із старих абонентів очікує на запис, клієнт не працює під час виконання. Завжди краще спіймати це питання за час компіляції.

  5. Повернути незмінний тип буде важко, якщо ви хочете використовувати хешмап як тип повернення тощо. Але якщо ви використовуєте власний тип, визначений користувачем, ви можете це контролювати.

Використовувати хешмап як тип повернення буде спокусливо, тому що ви можете уникнути створення кількох класів на початку, але це буде кошмаром для збереження коду в майбутньому. Переходьте до об'єктно орієнтованого !!!!


1
Ви, здається, правильно зрозуміли питання. Дякую.
Мухаммед Хасан хан

8

Однією з проблем буде те, що у багатьох випадках ключовим для хеш-таблиці буде рядок. Таким чином, споживачі цього методу повинні були б перед цим знати, які ключі використовувати для вилучення даних. Це дасть можливість помилок через помилки при доступі до даних.

Ще один недолік - рефакторізація. Якщо ви вирішите пізніше змінити ім’я члена, тоді у вас є купа магічних рядків, які також потрібно змінити. Набагато простіше перейменувати члена класу за допомогою інструментів рефакторингу, наданих більшістю хороших IDE. За допомогою хеш-таблиці вам, швидше за все, доведеться виконати операцію пошуку / заміни для всіх вихідних файлів, що може бути проблематично.

Нарешті, ви втратите час перевірки доступу учасника - як з назвою, так і з виду. Останнє не є такою проблемою, якщо ваша хеш-таблиця містить лише один тип предмета, але якщо вона містить багато (навіть у тому ж ланцюжку ієрархії), ви дійсно хочете використовувати типову систему своєї мови та отримати перевірку часу компіляції. У більшості IDE у вас є якісь функції intellisense / autocomplete - вони працюють, переглядаючи систему типів, але вони не зможуть допомогти вам з клавішами хеш-таблиць.

Що стосується випадків, коли було б доречно повернути хеш-таблицю (або іншу таку колекцію пар ключових значень), ви б використовували це, коли значення і ключі не відомі під час компіляції. Наприклад, якщо у вас є метод, який аналізує рядок запиту і повертає ключі та відповідні значення, хеш-таблиця буде хорошим вибором. У цьому випадку ви також хочете подумати над тим, щоб повернути якусь незмінювану чи хеш-таблицю лише для читання.

Редагувати - Більшість пунктів у цій відповіді перестають застосовуватись, коли ви говорите про динамічні мови :)


Що робити, якщо мова динамічна?
Мухаммед Хасан Хан

Я не знаю динамічних мов, тому хтось інший, можливо, може дати кращу відповідь на це. Але я знаю, що динамічні мови все одно не збирають перевірку типу часу. Але в цьому випадку повернення об'єкта та повернення хеш-таблиці не такі вже й різні.
MattDavey

3
@Hasan Khan: У цьому випадку різниця між хеш-таблицею та екземпляром класу фактично може не бути. Наприклад, у Javascript всі об’єкти є хештелями, а object.property - це точно те саме, що і object ['властивість']
Майкл Боргвардт

"За допомогою хеш-таблиці вам, швидше за все, доведеться виконати операцію пошуку / заміни для всіх вихідних файлів, що може бути проблематично." Тільки якщо ви вибрали погані ключі і ніколи не намагалися визначити стандартні, щоб вони були визначені в одному місці ...
Донал Fellows

7

Найважливішим аргументом проти цього було б те, що ви піддаєте споживачам занадто багато інформації. Коду, що споживає, потрібно лише знати, що це колекція (словник) ключових значень певного роду; чи вона реалізована як хешмап, список асоціацій, трие чи інше, є відносно нецікавим. Таким чином, правильним способом було б повернення за допомогою відповідного інтерфейсу ( IDictionaryабо будь-якої мови, яку ви обираєте) замість фактичного типу.

Все це, якщо ви насправді потрібен словник для представлення ваших даних, тобто ваші дані складаються з пар ключів / значень, де ключі є унікальними серед набору даних і не можуть бути виправлені під час компіляції. Якщо у вас є попередньо відомі ключі, вам слід створити для власних даних належний тип (або кілька, якщо потрібно). Це зводиться до того, чи вважаєте ви самі ключі частиною даних або частиною коду.

Редагувати :

Для уточнення, я використовую термін- словник для позначення найбільш загального типу структури даних ключових значень; Я не маю на увазі будь-яку мовну реалізацію, таку як Python dictабо .NETDictionary .


1
+1 для "Зводиться до того, чи вважаєте ви самі ключі частиною даних чи частиною коду." - Це хороший спосіб. Не впевнений, наскільки універсальний термін "словник" на відміну від "карта", наприклад.
MattDavey

Повернення словника не передбачалося. ключі були частиною коду, а не даними.
Мухаммед Хасан Хан

Справжнє питання - це міркування "Ви повинні створити належний тип". Питання чому?
Мухаммед Хасан хан

2

Я б задав собі запитання: "чи змінюються ключі в цьому словнику?" Якщо вони постійні, вам слід повернути об’єкт або іншу відповідну структуру даних. Якщо вони динамічні, ви, можливо, захочете повернути якусь структуру стилю словника. Нарешті, якщо є якісь ключі, які будуть постійними, і якийсь невідомий набір динамічних клавіш, ви можете повернути гібридну структуру даних, що включає деякі фіксовані значення та якийсь словник для переповнення.


Дійсно, ваша порада правильна, але питання полягає в тому, що не так у виборі використання хештелю, коли клас є кращим вибором.
Мухаммад Хасан Хан

Це не / або; клас може легко містити словник, якщо він вам потрібен.
Wyatt Barnett
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.