1. Java / Говнокод #13124

    +70

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    @OnEvent("search")
    	@ReportGritter(title = "message:error", text = "message:database_error")
    	Results search() {
    		final List<Result> results = new ArrayList<Result>();
    		int count = 0;
    		final List<?> search1 = this.bands.search(this.query);
    		final String group1 = HSSearch.GROUP_BANDS;
    		if (!search1.isEmpty()) {
    			results.addAll(this.transform(search1, group1));
    			count += search1.size();
    		}
    		final List<?> search2 = this.albums.search(this.query);
    		final String group2 = HSSearch.GROUP_ALBUMS;
    		if (!search2.isEmpty()) {
    			results.addAll(this.transform(search2, group2));
    			count += search2.size();
    		}
    		final List<?> search3 = this.tracks.search(this.query);
    		final String group3 = HSSearch.GROUP_TRACKS;
    		if (!search3.isEmpty()) {
    			results.addAll(this.transform(search3, group3));
    			count += search3.size();
    		}
    		this.results.setResults(results);
    		this.results.setCount(count);
    		return this.results;
    	}
    
    	private <E> String toTitle(final E item) {
    		if (item instanceof BandEntity) {
    			return ((BandEntity) item).getTitle();
    		}
    		if (item instanceof AlbumEntity) {
    			final AlbumEntity aitem = (AlbumEntity) item;
    			return String.format("%s (%d)", aitem.getTitle(), Integer.valueOf(aitem.getYear()));
    		}
    		if (item instanceof TrackEntity) {
    			return ((TrackEntity) item).getTitle();
    		}
    		return item.toString();
    	}
    
    	private <E> String toUrl(final E item) {
    		if (item instanceof BandEntity) {
    			final BandEntity bitem = (BandEntity) item;
    			return this.links.createPageRenderLinkWithContext(Band.class, bitem.getLetter(), bitem.getAlias())
    					.toAbsoluteURI();
    		}
    		if (item instanceof AlbumEntity) {
    			final AlbumEntity aitem = (AlbumEntity) item;
    			return this.links.createPageRenderLinkWithContext(Album.class, aitem.getBand().getLetter(),
    					aitem.getBand().getAlias(), aitem.getAlias()).toAbsoluteURI();
    		}
    		if (item instanceof TrackEntity) {
    			final TrackEntity titem = (TrackEntity) item;
    			return this.links.createPageRenderLinkWithContext(Album.class, titem.getAlbum().getBand().getLetter(),
    					titem.getAlbum().getBand().getAlias(), titem.getAlbum().getAlias()).toAbsoluteURI();
    		}
    		return this.links.createPageRenderLinkWithContext("").toAbsoluteURI();
    	}
    
    	private <E> List<Result> transform(final List<E> search, final String groupName) {
    		final ArrayList<Result> res = new ArrayList<Result>();
    		if (!search.isEmpty()) {
    			final String group = this.messages.get(groupName);
    			res.add(new Result(group));
    			for (final E item : search) {
    				res.add(new Result(group, this.toTitle(item), this.toUrl(item)));
    			}
    		}
    		return res;
    	}

    DRY in Action.
    мое домашнее творчество.

    Запостил: Lure Of Chaos, 06 Июня 2013

    Комментарии (7) RSS

    • > private <E> String toTitle(final E item) {
      > if (item instanceof BandEntity) {
      Мешать женерики с кастами и instanceof. Явно что-то не то с проектировкой.
      Да тот же полиморфизм. Сдеалать toTitle и toUrl в каждом классе.
      Ответить
      • решил это дело вынести в DAO, после чего вся писанина сократилась до не менее странного
        @SuppressWarnings({ "rawtypes", "unchecked" })
        	@OnEvent("search")
        	@ReportGritter(title = "message:error", text = "message:database_error")
        	Results search() {
        		final List<Result> results = new ArrayList<Result>();
        		int count = 0;
        		for (final ResultSearchDAO dao : new ResultSearchDAO[] { this.bands, this.albums, this.tracks }) {
        			final List<Result> search = dao.toResults(dao.search(this.query));
        			if (!search.isEmpty()) {
        				results.add(dao.getGroup().translate(this.messages));
        				results.addAll(search);
        				count += search.size();
        			}
        		}
        		this.results.set(results, count);
        		return this.results;
        	}
        Ответить
        • @SuppressWarnings({ "rawtypes", "unchecked" }) лучше переместить к объявлению final List<String> search, а не вешать на весь метод.
          Ответить
    • Причём этот E ещё и не extends ничего. Не удивлюсь, если у этих трёх *Entity нет общего предка.
      Ответить
    • Это не моё дело, но мне кажется, что ты не тем дома занимаешься. Мне бы было лень столько бесполезных букв набирать...
      Ответить
      • — Почему автор набирает столько буков?
        — Потому что может!
        Ответить

    Добавить комментарий