Це питання - це чимало проблем із вашою моделлю даних, зведеною в одну. Починати розкручувати їх потрібно по черзі. Більш природні, інтуїтивні рішення випадуть, коли ви намагатиметеся спростити кожен фрагмент головоломки.
Проблема 1: Ви не можете залежати від замовлення БД
Ваші описи сортування даних не зрозумілі.
- Найбільша потенційна проблема полягає в тому, що ви не вказуєте явного сортування у своїй базі даних за допомогою
ORDER BY
пункту. Якщо ви цього не зробите, це здається занадто дорогим, у вашій програмі є помилка . Базам даних дозволяється повертати результати в будь-якому порядку, якщо ви не вказали їх; Ви не можете залежати від того, щоб випадково повертати дані в порядку лише тому, що Ви кілька разів виконували запит, і це виглядає саме так. Порядок може змінитися, оскільки рядки переставляються на диску, або деякі видаляються, а нові замінюються, або додається індекс. Ви повинні вказати якесь ORDER BY
застереження. Швидкість бездоганна без коректності.
- Також незрозуміло, що ви маєте на увазі під значенням порядку вставки. Якщо ви говорите про саму базу даних, у вас повинен бути стовпець, який насправді відстежує це, і він повинен бути включений у ваш
ORDER BY
пункт. Інакше у вас є помилки. Якщо такий стовпець ще не існує, його потрібно додати. Типовими параметрами для таких стовпців буде стовпець із позначкою часу вставки або ключ з автоматичним збільшенням. Ключ з автоматичним збільшенням надійніше.
Проблема 2: Ефективність сортування пам’яті
Після того, як ви переконаєтесь, що гарантовано повертати дані в порядку, який ви очікуєте, ви можете використовувати цей факт, щоб зробити види пам’яті набагато ефективнішими. Просто додайте до набору результатів запиту row_number()
абоdense_rank()
стовпчик (або еквівалент вашої бази даних). Тепер кожен рядок має індекс, який дасть вам пряму вказівку про те, яким має бути замовлення, і ви можете сортувати це за допомогою пам'яті тривіально. Просто переконайтеся, що ви дали індексу значущу назву (як sortedBySomethingIndex
).
Віола. Тепер вам більше не доведеться залежати від порядку встановлення результатів бази даних.
Проблема 3: Вам навіть потрібно робити цю обробку в коді?
SQL насправді дуже потужний. Це дивовижна декларативна мова, яка дозволяє робити багато перетворень та агрегацій на ваших даних. Більшість БД навіть зараз підтримують міжрядкові операції. Їх називають віконними або аналітичними функціями:
Вам навіть потрібно втягувати свої дані в пам’ять так? Або ви могли виконати всю роботу над запитом SQL, використовуючи функції вікна? Якщо ви можете виконати всю (а може навіть навіть значну частину) роботи в БД, фантастично! Ваша проблема з кодом відходить (або стає набагато простіше)!
Проблема 4: Ти що робиш до цього data
?
Припустимо, що ви не можете все це зробити в БД, дозвольте мені це зрозуміти. Ви приймаєте дані як карту (яку вводять речі, за якими ви не хочете сортувати), потім ви повторюєте їх у порядку вставки та змінюєте мапу на місці, замінюючи значення деяких клавіш і додаючи новенькі?
Вибач, але що за чорт?
Абоненти не повинні турбуватися про все це . Створена вами система надзвичайно крихка. Потрібна лише одна тупа помилка (можливо, навіть зроблена власноруч, як ми все зробили), щоб зробити одну маленьку неправильну зміну, і вся справа руйнується, як колода карт.
Ось, можливо, краща ідея:
- Є ваша функція приймає
List
.
- Є кілька способів вирішити проблему замовлення.
- Застосувати Fail Fast. Введіть помилку, якщо список не в тому порядку, якого вимагає функція. (Примітка. Ви можете скористатися індексом сортування з проблеми 2, щоб визначити, чи є він.)
- Створіть відсортовану копію самостійно (знову використовуючи індекс із проблеми 2).
- Придумайте спосіб побудови самої карти в порядку.
- Побудуйте потрібну вам карту внутрішньо для функції, тому абонентові не потрібно про це піклуватися.
- Тепер перегляньте все, що ви маєте для представлення порядку, і робіть те, що вам потрібно.
- Поверніть карту або перетворіть її у відповідне значення повернення
Можливим варіантом може бути побудова відсортованого подання, а потім створення карти ключових для індексації . Це дозволить вам змінювати відсортовану копію на місці, не випадково створюючи дублікати.
А може, це має більше сенсу: позбудьтесь data
параметра і processData
фактично отримайте власні дані. Потім ви можете задокументувати, що ви це робите, оскільки він має дуже конкретні вимоги щодо способу отримання даних. Іншими словами, зробіть функцію власником всього процесу, а не лише одного його фрагмента; взаємозалежності занадто сильні, щоб розділити логіку на менші шматки. (Змініть назву функції в процесі.)
Можливо, це не допоможе вашій ситуації. Я не знаю без повних деталей проблеми. Але я знаю тендітний і заплутаний дизайн, коли чую його.
Підсумок
Я думаю, що тут проблема полягає в тому, що чорт у деталях. Коли я починаю наштовхуватися на подібні проблеми, це зазвичай тому, що у мене є невідповідне представлення моїх даних щодо проблеми, яку я намагаюся реально вирішити. Найкраще рішення - знайти краще представлення , і тоді моя проблема стає простою (можливо, не простою, але простою).
Знайдіть когось, хто до цього звернеться: ваше завдання - звести свою проблему до набору простих, простих. Тоді ви можете створити надійний, інтуїтивно зрозумілий код. Поговоріть з ними. Хороший код та гарний дизайн змушують вас думати, що будь-який ідіот міг їх придумати, адже вони прості та прості. Можливо, є старший розробник, який має такий розум, з яким можна поговорити.