|
|
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Вот такой вот пятничный говнокодец. Очень часто нужно сортировать сущности в коллекциях по разным колонкам. В настоящий момент это уродство выглядит вот так. Entity.java Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. SortProcessor Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. Обычно List<entity> связана 1:1 с GWT FlexTable и отображается на UI пользователя как есть. Сортировать на стороне источника данных не всегда возможно. Где БД - мы как-то сортируем а вот из rest-сервисов приходится делать всё самим. Встроенные DBMS (Derby, HyperSonic, H2) мы не используем. Сами entities лежат в скоупе GWT компилляции и имеют поля только основных примитивных типов (int, String, Date, BigDecimal). Сложные объекты я пока не встречал. Вопрос: Как сортировать универсально? Нужен какой-то компонент (SpringBean) которому на вход приходит неизвестная коллекция List<Object> и номер колонки и direction (ASC|DESC) по которой надо сортировать и на выходе мы имеет отсортированное. Буду рад выслушать идеи, Best Practices и почитать исходники. Спасибо! P.S. Реверс тоже радует :) P.P.S Фух. Написал таки. Пятница ... мать ее так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 20:48 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
А reflection не спасет отца русской демократии? Если нужна производительность, то что-то типа CGLIB AFAIK & IMHO. Я бы в этом направлении делал, но осторожно, думая о производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 20:56 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Codegeneration меня точно спасёт. Не утонуть-бы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 21:11 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
http://tips4java.wordpress.com/2008/10/23/bean-comparator/ говнокод, говнокодом, но тут ещё какой-то тупак с индексом поля. Кто придумал свойства через int адресовать? В остальном, всё достаточно примитивно. Надо тупо избавиться от копипаста и станет более менне адекватно. Попробую изобразить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 21:32 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 21:53 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, блин, прогнал немного. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 21:58 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
switch..case можно смело в саму entity унести ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 22:42 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
О. Спасибо попробую. С entities такой трабл что компилируются они плагином gwt-maven-plugin а с этим есть различные language limitations. Не всё что есть в Java компилируется в GWT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 23:25 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Код: java 1. Рекомендую посмотреть Commons BeanUtils, там уже всё сделали (а именно BeanComparator) http://commons.apache.org/proper/commons-beanutils/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2014, 22:00 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
mayton , Если интересно сделать именно самому, то я бы смотрел банально в сторону рефлекшена и Unsafe: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. Ну и прочих фишек и оптимизаций уже сами нафигачите. Например, проверять SortType можно один раз на весь процесс сортировки, а не на каждом сравнении, как у меня. Можно передавать опциональный Comparator. И т.д.. Но вообще, как сказали выше, такое наверняка уже давным давно есть в каких-нибудь утилитарных библиотеках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2014, 22:41 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Плюс можно, например, не создавать новый компаратор на каждый раз, а статически их создать и закэшировать. Например, по каждому типу и "направлению сортировки". Таким образом, у вас их будет штук эдак 18 (9 типов * 2 направления), зато GC Будет за вами меньше мусора собирать. Ну это уже совсем изврат, если прям все соки надо выжать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2014, 22:50 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Шняга какая-то, зачем рефлекшн. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2014, 23:10 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
cdtyjvПлюс можно, например, не создавать новый компаратор на каждый раз, а статически их создать и закэшировать. Например, по каждому типу и "направлению сортировки". Таким образом, у вас их будет штук эдак 18 (9 типов * 2 направления), зато GC Будет за вами меньше мусора собирать. Ну это уже совсем изврат, если прям все соки надо выжать Это тема. +1 Я думаю что нам нужен пул компараторов. У нас в коде штук 200 интерфейсов и на каждый есть 1 FlexTable c 5-10 колонками сортировок. Тоесть грубо говоря нам надо 200 * 5 = 1000 компараторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 00:20 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
ivanraРекомендую посмотреть Commons BeanUtils, там уже всё сделали (а именно BeanComparator) http://commons.apache.org/proper/commons-beanutils/ Мне не нужно ничего рекомендовать, я вопросов не задавал. BeanComparator работает на рефлексии. Мой код - нет. Я просто отрефакторил то что привел mayton ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 10:38 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonЭто тема. +1 Я думаю что нам нужен пул компараторов. У нас в коде штук 200 интерфейсов и на каждый есть 1 FlexTable c 5-10 колонками сортировок. Тоесть грубо говоря нам надо 200 * 5 = 1000 компараторов. Сортировка клиентская или серверная? В любом случае зачем пул, если на сервере компаратор быстро издохнет в молодом поколении, а на клиенте никто не будет так часто и постоянно сортировать все возможные интерфейсы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 10:42 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Лагман, А зачем столько новых бестолковых Comparator для типов, которы уже реализуют Comparable? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 10:43 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Лагман, y нас есть необходимость сортировать также null значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 11:29 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
mayton, А так ли нужен вам List<FuckenEntity> ? Не подойдет ли List<List<Comparable>>, т.е. матрица свойств обектов, вместо списка обектов. Ну и можно класс отдельный создать Matrix<T extends Comparable>, который будет еще и описания колонок внутри себя хранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 12:42 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDMatrix<T extends Comparable> Не так, правильнее Matrix<? extends Comparable> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 12:44 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczBeanComparator работает на рефлексии. Мой код - нет. Я просто отрефакторил то что привел mayton Все так, но доступ к геттерам в BeanComparator кешируется, так что расходы на рефлексию (в большой коллекции, либо при многократной сорировке) сводятся к вызову этих геттеров, что сравнимо по производительности с работой через интерфейсы. Поэтому BeanComparator не такой уж и медленный, как кажется на первый взгляд. Конечно, хардкод будет самый быстрый, но можно ли это считать Best practices? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 13:08 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueВ каком кошмаре живут явисты. https://code.google.com/p/lambdaj/ Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 15:25 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Alexey TominMonochromatiqueВ каком кошмаре живут явисты. https://code.google.com/p/lambdaj/ Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :) Да как бы нет проблем. )) Но как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name) На что я кстати и привел ссылку. Просто ты наверное не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 15:31 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueAlexey Tominпропущено... Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :) Да как бы нет проблем. )) Но как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name) Будет в JDK8 MonochromatiqueНа что я кстати и привел ссылку. Просто ты наверное не понял. Я не понял, что ты этим хотел сказать, да :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 17:41 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЛагман, А зачем столько новых бестолковых Comparator для типов, которы уже реализуют Comparable? У вас проблемы с восприятием примеров, и с ООП. maytonЛагман, y нас есть необходимость сортировать также null значения. У вас проблемы с восприятием примеров. Алсо своим воторым вопросом вы отвечаете на свой первый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 18:36 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
а, думал это один человек, сорри. В общем итого mayton отвечает на вопрос Blazkowicza ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 18:37 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
ЛагманУ вас проблемы с восприятием примеров, и с ООП. У вас проблемы с кодированим и культурой общения. Меня каждый раз умиляет как джуниоры из года в год ваяют подобные страницы кода, которые не делают ничего полезного и заменяются парой методов и классом. ЛагманmaytonЛагман, y нас есть необходимость сортировать также null значения. У вас проблемы с восприятием примеров. Алсо своим воторым вопросом вы отвечаете на свой первый. Мой рефакторинг первоначального кода точно так же справляется с null значениями, как и оригинальный код. Без копараторов. А вот подобный код в проекте Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. это бесполезный шум. Не нужен компаратор, так где есть Comparable. Не нужно два разных компаратора для двух Comparable типов. Такой код не несет никакой пользы. Просто усложяет код, не более. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 18:43 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Blazkowiczswitch..case... +1000 mayton, Вот еще одно оригинальное решение: http://stackoverflow.com/a/1421537 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 19:03 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDmayton, А так ли нужен вам List<FuckenEntity> ? Не подойдет ли List<List<Comparable>>, т.е. матрица свойств обектов, вместо списка обектов. Ну и можно класс отдельный создать Matrix<T extends Comparable>, который будет еще и описания колонок внутри себя хранить. Мой вопрос слишком сложен для местной массы? Настолько сложен, что даже непонятно о чем это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 21:28 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDМой вопрос слишком сложен для местной массы? Конечно. Мы тут тупая масса идиотов. Куда нам до Вас. HoBTIDНастолько сложен, что даже непонятно о чем это? Тихо сам с собою я ведь беседу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 22:12 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDHoBTIDmayton, А так ли нужен вам List<FuckenEntity> ? Не подойдет ли List<List<Comparable>>, т.е. матрица свойств обектов, вместо списка обектов. Ну и можно класс отдельный создать Matrix<T extends Comparable>, который будет еще и описания колонок внутри себя хранить. Мой вопрос слишком сложен для местной массы? Настолько сложен, что даже непонятно о чем это? http://lurkmore.to/Неуловимый_Джо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 01:18 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDHoBTIDmayton, А так ли нужен вам List<FuckenEntity> ? Не подойдет ли List<List<Comparable>>, т.е. матрица свойств обектов, вместо списка обектов. Ну и можно класс отдельный создать Matrix<T extends Comparable>, который будет еще и описания колонок внутри себя хранить. Мой вопрос слишком сложен для местной массы? Настолько сложен, что даже непонятно о чем это? Он не сложен. Он - не нужен. У нас сопряжение GWT виджетов с слоем процессоров идёт через списки Entities. Это в некотором роде мета-описание самих сущностей. И оно несёт материальный смысл. Как метаинформация о колонках в БД. Мы можем абстрагироваться от колонок но мета-описание придётся сделать на другом Layer. А это дополнительные расходы. Зачем описывать сущности еще раз в другом месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 02:41 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonУ нас сопряжение GWT виджетов с слоем процессоров идёт через списки Entities.Т.е. сопряжение нельзя сделать с матрицей вместо списка? maytonЭто в некотором роде мета-описание самих сущностей. И оно несёт материальный смысл. Как метаинформация о колонках в БД.Это имеет какой-то смысл, только если у ваших сущностей есть поведение, которое необходимо реализовать именно в этом сортируемом списке, а не где-то еще. Если там просто геттеры и сеттеры, все можно сделать через матрицу. Если, например пользователь выбирает из списка объект и с ним делает что-то сложное, то сам объект можно создавать только когда пользователь начал с ним что-то делать. mayton... Мы можем абстрагироваться от колонок но мета-описание придётся сделать на другом Layer. А это дополнительные расходы. ... Зачем описывать сущности еще раз в другом месте.Вполне логично задать симметричный вопрос, зачем описывать сущности в этом месте? Ведь по сути, сущности здесь не нужны, нужна просто таблица с их свойствами. А эта таблица - другая, совершенно отдельная сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 10:26 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Эта Entity(DTO) описывается на уровне бизнеса. Поле такое-то... тип такой-то.. DSL в некотором роде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 11:21 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonЭта Entity(DTO) описывается на уровне бизнеса. Поле такое-то... тип такой-то.. DSL в некотором роде. Как связан "уровень бизнеса" и таблица со строками и числами на экране пользователя? Вы Excel пользовались когда-нибудь? Вот Экселю совершенно наплевать на любые уровни бизнеса, данные - это просто таблица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 11:45 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Если же вам потом понадобится нечто "очень бизнесовое", добавьте в эту табличку колонку с id, по которому потом можно создать сущность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 11:46 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDЕсли же вам потом понадобится нечто "очень бизнесовое", добавьте в эту табличку колонку с id, по которому потом можно создать сущность. В чем преимущества? Вы предлагаете решение без очевидных достоинств и требуете доказательств что оно не самое оптимальное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 11:49 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВ чем преимущества? Вы предлагаете решение без очевидных достоинств и требуете доказательств что оно не самое оптимальное? Преимущества в простой сортировке и фильтрации такой таблицы, без рефлексии. Функции работы с ней универсальны, все что им нужно, это чтобы значения в одной колонке были сравнимы между собой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 12:02 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDПреимущества в простой сортировке и фильтрации такой таблицы, без рефлексии. Моя версия решения проблемы не использует рефлексию. Задача сортировка списка списков по элементу внутреннего списка слабо отличается от задачи сортировки списка бинов по свойству. HoBTIDФункции работы с ней универсальны, все что им нужно, это чтобы значения в одной колонке были сравнимы между собой. Забудьте слово "универсальный". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 12:09 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczМоя версия решения проблемы не использует рефлексию. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Вот эта версия??? Осознаете ли Вы значение слова "говнокод"??? BlazkowiczЗадача сортировка списка списков по элементу внутреннего списка слабо отличается от задачи сортировки списка бинов по свойству.Даже если предположить, что слабо отличается (не хочу сейчас углубляться в случаи, когда она отличается очень сильно), как ее реализовать? В случае бинов - только рефлексией или же забитыми гвоздями switch или if. BlazkowiczЗабудьте слово "универсальный". Мне жаль, что вы его забыли, уж я-то не забуду никогда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 12:24 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDОсознаете ли Вы значение слова "говнокод"??? Многоуважаемое хамло. На данный момент это наиболее простой и компактный код приведенный в этой теме и соответствующий семантике оригинального метода. Вашего кода мы пока в теме не увидели. HoBTIDДаже если предположить, что слабо отличается (не хочу сейчас углубляться в случаи, когда она отличается очень сильно), как ее реализовать? Правильно, углублятся не нужно. Пукнул в лужу и пошел. Код привести не можем. Обосновать его преимущество не можем. Хамить - всегда пожалуйста. HoBTIDВ случае бинов - только рефлексией или же забитыми гвоздями switch или if. Ну, у вас, вероятно, если более разумные и "универсальные" идеи как привязать свойства к индексам полей. Только вы нам их не расскажите, как я понял. HoBTIDМне жаль, что вы его забыли, уж я-то не забуду никогда. Слово "универсальный" это то как джуниоры описывают свой код. Они понятия не имееют о таких критериях, как связанность, сцепление, читаемость, ошибкоустойчивость к будущим изменениям и т.п. У них на всё один критерей "универсальный". Я из этого возраста давно вышел, поэтому данным словом код никогда не измеряю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 12:33 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКод привести не можем. Обосновать его преимущество не можем. Кода будет довольно много, я его писал в одном из проектов. Зато он не зависит от сущности, это я называю словом "универсальный". Если у вас недопонимание этого слова в связи с психическими травмами получеными в джуниорском периоде, это не значит, что и у других похожие травмы. BlazkowiczНу, у вас, вероятно, если более разумные и "универсальные" идеи как привязать свойства к индексам полей. Только вы нам их не расскажите, как я понял. Ну что ж, пожалуй напишу азы, вдруг кто-нибудь поймет? Код: java 1. 2. 3. 4. Осталось написать класс ColumnDef - описание колонки, и различные методы класса VisualTableModel, вот тут кода будет много, но за соответствующее вознаграждение, я готов его предоставить. Blazkowicz ... о таких критериях, как связанность, сцепление, читаемость, ошибкоустойчивость к будущим изменениям и т.п. У них на всё один критерей "универсальный". Я из этого возраста давно вышел, поэтому данным словом код никогда не измеряю. И Ваш код удовлетворяет критерию слабой связности, например? Или, может быть, он ошибкоустойчивый к будущим изменениям? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 12:55 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDКода будет довольно много, я его писал в одном из проектов. Ну, вот и я о том же. HoBTIDЗато он не зависит от сущности, это я называю словом "универсальный". Ну, так бины тогда можно вообще выкинуть и писать всё на массивах и хэшмапах. На форумах каждые два года появляется нуб с такой "оригинальной" и "универсальной" идеей. HoBTIDЕсли у вас недопонимание этого слова в связи с психическими травмами получеными в джуниорском периоде, это не значит, что и у других похожие травмы. Да, всё понятно уже. Можешь дальше не закатывать истерику. HoBTIDНу что ж, пожалуй напишу азы, вдруг кто-нибудь поймет? Код: java 1. 2. 3. 4. Круто ваще. Как я сразу об этом не подумал. Спасибо, сансэй. HoBTIDОсталось написать класс ColumnDef - описание колонки, и различные методы класса VisualTableModel, вот тут кода будет много, Какая мелочь. HoBTIDно за соответствующее вознаграждение, я готов его предоставить. Куда переводить? HoBTIDИ Ваш код удовлетворяет критерию слабой связности, например? Или, может быть, он ошибкоустойчивый к будущим изменениям? Это здесь при чем? Это же не я заявляю об "универсальности". Мой код лаконичный - пока что не вижу чтобы кто-то более простое решение предложил. Полностью сохраняет семантику оригинального метода. Полностью сохраняет изначальный дизайн, класс, который отвечал за маппинг индекса на свойства, всё так же за это и отвечает. Это не значит что я с первоначальным дизайном согласен. Поэтому и порекомендовал унести маппинг индекса на свойства в саму сущность. Вы же предлагаете автору решение, - которое потребует перелопатить вагон существующего кода в том числе за пределами указаных методов. - решение, которое не факт что натянется на существующие view - решение, которое обладает непостижимо максимальной "универсальностью" У меня на проекте имеется ArrayBeanTableModel, универсальный для всех сущностей. Без всяких матриц. Никак от детипизации я не страдаю. Ваше же решение сродни динамической типизации. Никакой возможности контролировать что там в матрице и как-то этим пользоваться. Единственное что можно делать, это выводить на View. Какая-от сомнительная универсальность выходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 13:08 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczУ меня на проекте имеется ArrayBeanTableModel, универсальный для всех сущностей. Без всяких матриц. Т.е. у себя вы используете решение, не зависящее от типа сущности, а автору темы предлагаете зависящее. Оригинально. И на каком же принципе оно основано? Дайте угадаю, рефлексия? BlazkowiczНикак от детипизации я не страдаю. Ваше же решение сродни динамической типизации. Никакой возможности контролировать что там в матрице и как-то этим пользоваться. Единственное что можно делать, это выводить на View. Какая-от сомнительная универсальность выходит. Действительно, контролировать ничего не нужно, т.к. данные через эту матрицу не редактируются, только выводятся для просмотра. Редактирование строчки нужно делать уже через сущность в отдельной форме. Преимущество в том, что матрица реализует все требования к списку для просмотра (сортировка, фильтрация, может быть реализовано постраничная загрузка) и этим не нужно заморачиваться в сущностях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 13:30 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDТ.е. у себя вы используете решение, не зависящее от типа сущности, а автору темы предлагаете зависящее. Оригинально. Автору я предлагаю решение проблемы о которой он спросил. А не переписать половину проекта под "универсальное" решение. HoBTIDИ на каком же принципе оно основано? Дайте угадаю, рефлексия? С фига ли? Мапятся колонки на свойства схожим образом через switch case. У меня гриды на View слишком динамично меняются и довольно сильно отличаются от модели. Поэтому существует отдельный слой маппинга модели на гриды. Зато через него всегда доступна строго типизированя модель, через которую я всегда могу запускать бизнес-логику, конкретного типа. В вашем же решении, отдельно матрица только для просмотра, отдельно список сущностей где-то ещё, либо списка вообще нет, и сущности каждый раз пересобираеются из матрицы без какого либо контроля типов. Действительно что может быть проще и универсальнее массива массивов. HoBTIDДействительно, контролировать ничего не нужно, т.к. данные через эту матрицу не редактируются, только выводятся для просмотра. Редактирование строчки нужно делать уже через сущность в отдельной форме. Оу, но теперь понятно всё. Т.е. данные можно только редактировать и показывать. Теперь мы пришли к тому что матрица сразу делает грид не доступным для радактирования, а лишь только через отдельную форму. Очень "универсально". HoBTIDПреимущество в том, что матрица реализует все требования к списку для просмотра (сортировка, фильтрация, может быть реализовано постраничная загрузка) и этим не нужно заморачиваться в сущностях. У меня есть сортировка, и постраничная загрузка. Фильтрация унесена на уровнеь работы с базой. Локально фильтровать сущности, как-то странно и не эффективно. И всё это на типизировном списке сущностей, без матрицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 13:40 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczС фига ли? Мапятся колонки на свойства схожим образом через switch case. Поэтому существует отдельный слой маппинга модели на гриды. switch case независимо от типа сущности? Я поражен. Или же для каждой сущности есть отдельный объект маппинга, куда спрятан этот switch, и это Вы называете "независимо"? BlazkowiczЗато через него всегда доступна строго типизированя модель, через которую я всегда могу запускать бизнес-логику, конкретного типа. В вашем же решении, отдельно матрица только для просмотра, отдельно список сущностей где-то ещё, либо списка вообще нет, и сущности каждый раз пересобираеются из матрицы без какого либо контроля типов. Действительно что может быть проще и универсальнее массива массивов. Действительно, у моего решения есть недостаток, если нужна бизнес логика непосредственно в списке, его использовать нельзя. Но чаще всего, такая логика не нужна. Отдельного списка сущностей нет, сущность загружается из БД или берется из кэша, при начале редактирования. Из матрицы пересобирать не совсем корректно, т.к. она может не содержать всех колонок, и уж точно не содержит табличных частей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 14:07 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDswitch case независимо от типа сущности? Я поражен. Или же для каждой сущности есть отдельный объект маппинга, куда спрятан этот switch, и это Вы называете "независимо"? Прикинь, да. Модель на View надо как-то маппить. Эка неожиданность для гуру дизайна. Правда? В вашем решении возможны два варианта. Либо вы в матрицу вываливаете всё что только можно. Каким образом, например, гарантировать порядок колонок? Либо у вас присутствует точно такой же маппинг, но в неявном виде. Что затрудняет его поддержку. HoBTIDДействительно, у моего решения есть недостаток, если нужна бизнес логика непосредственно в списке, его использовать нельзя. Но чаще всего, такая логика не нужна. Добро пожалуйвать в чудесный мир Anemic Domain Model. HoBTIDОтдельного списка сущностей нет, сущность загружается из БД или берется из кэша, при начале редактирования. Мы уже поняли, что у вас кроме просмотра редактирования, другой логики быть не может. Можно не продолжать. HoBTIDИз матрицы пересобирать не совсем корректно, т.к. она может не содержать всех колонок, и уж точно не содержит табличных частей. Ну, понятно. Все прелести Anemic Domain Model. Если нужна логика для конктретного типа, она будет реализована прям там в таблице с матрицей этого типа. Это очень удобно, не нужно вообще париться о разделении модели и представлении. До тех пор пока одна и та же логика вдруг не потребуется на нескольких разных слоях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 14:14 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Тут цена вопроса - "сферический проект в вакууме" или уже имеющийся проект который писали в определённом ключе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 14:18 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonТут цена вопроса - "сферический проект в вакууме" или уже имеющийся проект который писали в определённом ключе. Как можно?! Саппорт это для джуниоров. Гуру дизайна всё пишет с нуля! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 14:29 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczmaytonТут цена вопроса - "сферический проект в вакууме" или уже имеющийся проект который писали в определённом ключе. Как можно?! Саппорт это для джуниоров. Гуру дизайна всё пишет с нуля! Гуру дизайна и совершенство архитектурной мысли постепенно переписывает плохие участки. А не продолжает говнокодить в том же стиле, как изначально была написана система. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 14:54 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDГуру дизайна и совершенство архитектурной мысли постепенно переписывает плохие участки. А не продолжает говнокодить в том же стиле, как изначально была написана система. Ключевое слово "постепенно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 14:57 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczКлючевое слово "постепенно". Конечно, параллельно с имеющимися, создаете класс матрицы, создаете новую форму в дополнение к существующей форме списка одного из типов сущностей, и ее уже делаете через матрицу. Кстати, порядок колонок задается просто порядком их добавления в список колонок (List<ColumnDef> columns). А пользователь естественно может переставлять колонки во View. Поскольку матрица это всего лишь ViewModel, она ничего не затрагивает из бизнес-логики. На нее легко можно перевести отдельные списки, не трогая "половину приложения". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 15:04 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDПоскольку матрица это всего лишь ViewModel, она ничего не затрагивает из бизнес-логики. На нее легко можно перевести отдельные списки, не трогая "половину приложения". Да, понятно, что ViewModel. Только не понятно нафига оно. ViewModel в этом случае исключительно односторонняя. Хотя ViewModel по задумке обеспечивает связь в обе стороны. Кроме этого ViewModel концепия удобна в случае внятных инструментов биндинга. Для чего она нужна, если биндинга нет - не понятно. Ну и вы нам так и не расказали свою сокровенную тайну как именно Model мапиться на ViewModel. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 15:34 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНу и вы нам так и не расказали свою сокровенную тайну как именно Model мапиться на ViewModel. Да вы оказывается кое-что понимаете. Это действительно тайна. В колонке ViewModel указывается путь по свойствам до нужного реквизита, например: Код: java 1. 2. Затем, по пути свойств определяются имена таблиц и колонок в БД. Строится запрос с JOIN'ами и из результата его выполнения заполняется матрица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 15:58 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDДа вы оказывается кое-что понимаете. Снова нарываетесь на грубость. HoBTIDЭто действительно тайна. В колонке ViewModel указывается путь по свойствам до нужного реквизита, например: Код: java 1. 2. Чем это принципиально лучше type safe switch case? В коротм не нужны константы на каждое свойство. HoBTIDЗатем, по пути свойств определяются имена таблиц и колонок в БД. Строится запрос с JOIN'ами и из результата его выполнения заполняется матрица. Ну, понятно. View слой самым прямым образом влияет на доступ к данным. И теперь вы полностью подтвердили мои догадки про джуниорство. Лет 7-8 назад я дизайнил решения именно таким же образом. "Универсально", но при этом то что называется термином Over Abstracted. "Универсальность" заключается в том что, действительно один и тот же код покрывает все сущности. Это с точки зрения молодого программиста мега опупенно. Но при этом на лицо все недостатки излишней абстрагированости: - если появляются требования не задуманые изначально абстракцией, то нужно рефакторить саму абстракцию - ООП идет лесом, так как нет никакой возможности заточить разное поведение, под разные сущности. У меня, например, в проекте есть у бизнес сущностей сложное вычислимое свойство. Которое не только влияет на бизнес-процесс, но и требует специального отображения на view. И как же прикажете быть в таком Anemic View, где бизнес сущности принципиально отствутствуют? Выносить вычисления в БД? И подрезать таким образом переносимость? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 16:10 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueНо как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name) Ещё пара месяцев и будет personList.sort((p1, p2) -> p1.name.compareTo(p2.name)); OrderBy, тоже можно забабахать со ссылкой на getter. http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html Только в данном случае в этом пользы особой нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 20:37 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
С++ возвращается? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 20:41 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonС++ возвращается? Код: plaintext 1. Угу. Java и так не дружелюбна к нубам. А теперь со стрелочками и двоеточиями будет ещё головоломнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 20:52 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Жду сахара в "девятке". Вот такую конфету. Как в "шарпах" Вместо: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. вот так писать. Код: java 1. . Сорц был нагло спизж взят мной из Хаба-хабра. И подпилен чтоб был похож на Java ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2015, 13:22 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
mayton, Берем Groovy и не ждем) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2015, 16:35 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonЖду сахара в "девятке". Вот такую конфету. Как в "шарпах" Ужас. От null'ов надо избавляться, а не прятать их за синтаксическим сахаром. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 01:02 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
LeonidvmaytonЖду сахара в "девятке". Вот такую конфету. Как в "шарпах" Ужас. От null'ов надо избавляться, а не прятать их за синтаксическим сахаром. +1. Мы может заменить null на NullObject в СВОЁМ коде. Но OVER9000 библиотек удалённого вызова или persistence оставляют за собой право возвращать неинициализированные части объекта (для SOAP) или null филды если это БД. Таковы реалии. Как с этим бороться - неизвестно. И вобщем-то даже не проблема с null как с "признаком" особого статуса return. А проблема с семантикой операций которые с ним разрешены. В БД к примеру nulls можно суммировать, ранжировать и сортировать и делать операции больше/меньше. Результат - будет детерминирован и никакого исключения не будет. В Java подобная семантика - непозволительна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 06:35 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
mayton Код: java 1. Сорц был нагло спизж взят мной из Хаба-хабра. И подпилен чтоб был похож на JavaНасколько я могу судить по "Java SE 8. Вводный курс" Кея Хорстмана, есть isNull, nonNull и Optional. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 07:47 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonLeonidvпропущено... Ужас. От null'ов надо избавляться, а не прятать их за синтаксическим сахаром. +1. Мы может заменить null на NullObject в СВОЁМ коде. Но OVER9000 библиотек удалённого вызова или persistence оставляют за собой право возвращать неинициализированные части объекта (для SOAP) или null филды если это БД. Таковы реалии. Как с этим бороться - неизвестно. Изолировать null в слое взаимодействия с этими инструментами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2015, 15:30 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Usman, Если хочется такого, то есть Scala. implicit есть, ?? - при работе с option это фактически map, flatMap и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 11:06 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Leonidvmaytonпропущено... +1. Мы может заменить null на NullObject в СВОЁМ коде. Но OVER9000 библиотек удалённого вызова или persistence оставляют за собой право возвращать неинициализированные части объекта (для SOAP) или null филды если это БД. Таковы реалии. Как с этим бороться - неизвестно. Изолировать null в слое взаимодействия с этими инструментами. Цена этого решения почти такая-же как "лесенка" из if. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 20:43 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
LeonidvЕсли хочется такого, то есть ScalaБез "подмешивания"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2015, 21:13 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Перегрузка "+","-".... для BigDecimal всё таки нужна. Иначе финансовый софт выглядит лажово. Здесь как-бе принципы Java-ООП звучат убедительно но рука тянется за перегрузкой. +Джунгарики-нубасы подкидывают траблов. Только отвернёшся - они "запилят" double или float в финансовые величины. И ведь хочется выглядеть убедительным.... но этот BigDecimal не выглядит рефакторингом хотя-бы с эстетической точки зрения. Ты вроде точность улучшил ... а код превратился в месиво методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2015, 13:07 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Еще сахарка подкину. Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 22:37 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Прошу прощения. Я сюда припёрся снова сонный и сердитый. Ох встречу я этого Гослинга - дам ему подсрачника в его джинсовый зад. А потом сниму с него очки и втопчу в асфальт. Вот пишу Код: java 1. 2. 3. и каждый рас зависаю на 5 - 15 секунд. Вспоминаю там знак ">" это аналог положительного целого или наоборот в предикате compareTo. Ну неужели не мох ты заложить в стандарте хотя-бы этот математический оператор, чортов ты бородач?! P.S. Всё аривуар. Расстроен. Пошёл пить лекарство. P.S. Извините если чо. Простужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 20:28 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
mayton Код: java 1. 2. 3. Я за то чтобы такой код не писать. Я за читаемость: if(someObj.greaterThan(anotherObject)){ if(someObj.olderThan(anotherObject)){ if(greater(someObject, thenObject)){ И в том же духе. Имя метода должно следовать предметной модели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 14:35 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Blazkowiczmayton Код: java 1. 2. 3. Я за то чтобы такой код не писать. Я за читаемость: if(someObj.greaterThan(anotherObject)){ if(someObj.olderThan(anotherObject)){ if(greater(someObject, thenObject)){ И в том же духе. Имя метода должно следовать предметной модели. прикольно, что Java-программисты называют это "читаемость". по мне читаемость - это if( someobject > otherobject ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2015, 19:54 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Groovy Safe navigation operator ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2017, 02:25 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2122562]: |
0ms |
get settings: |
7ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
56ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
109ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 436ms |

| 0 / 0 |
