Skip to content

Commit e6d1fc9

Browse files
Refactor MemeAggregationServiceImpl to eliminate code duplication
Extracted common pattern from increaseMemeViewCount, increaseMakeCustomMemeCount, and increaseShareMemeCount into a generic recordMemeActivity method that uses functional interfaces to parameterize behavior. This refactoring: - Eliminates repeated code pattern (getMeme -> saveLog -> updateCache) - Improves maintainability by centralizing the logic - Makes the three public methods more concise and readable - Preserves all existing behavior and transaction semantics - All tests continue to pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
1 parent 312323d commit e6d1fc9

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

src/main/java/spring/memewikibe/application/MemeAggregationServiceImpl.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
import spring.memewikibe.infrastructure.MemeViewLogRepository;
1818
import spring.memewikibe.support.error.MemeWikiApplicationException;
1919

20+
import java.util.function.Consumer;
21+
import java.util.function.Function;
22+
2023
import static spring.memewikibe.support.error.ErrorType.MEME_NOT_FOUND;
2124

2225
@RequiredArgsConstructor
@@ -32,25 +35,19 @@ public class MemeAggregationServiceImpl implements MemeAggregationService {
3235
@Override
3336
@Transactional
3437
public void increaseMemeViewCount(Long memeId) {
35-
Meme meme = getMemeBy(memeId);
36-
memeViewLogRepository.save(MemeViewLog.of(meme));
37-
inMemoryPopularMemeCache.onMemeViewed(memeId);
38+
recordMemeActivity(memeId, MemeViewLog::of, memeViewLogRepository::save, inMemoryPopularMemeCache::onMemeViewed);
3839
}
3940

4041
@Override
4142
@Transactional
4243
public void increaseMakeCustomMemeCount(Long memeId) {
43-
Meme meme = getMemeBy(memeId);
44-
memeCustomLogRepository.save(MemeCustomLog.of(meme));
45-
inMemoryPopularMemeCache.onMemeCustomized(memeId);
44+
recordMemeActivity(memeId, MemeCustomLog::of, memeCustomLogRepository::save, inMemoryPopularMemeCache::onMemeCustomized);
4645
}
4746

4847
@Override
4948
@Transactional
5049
public void increaseShareMemeCount(Long memeId) {
51-
Meme meme = getMemeBy(memeId);
52-
memeShareLogRepository.save(MemeShareLog.of(meme));
53-
inMemoryPopularMemeCache.onMemeShared(memeId);
50+
recordMemeActivity(memeId, MemeShareLog::of, memeShareLogRepository::save, inMemoryPopularMemeCache::onMemeShared);
5451
}
5552

5653
@Async
@@ -60,6 +57,18 @@ public void handleMemeViewed(MemeViewedEvent event) {
6057
increaseMemeViewCount(event.memeId());
6158
}
6259

60+
private <T> void recordMemeActivity(
61+
Long memeId,
62+
Function<Meme, T> logFactory,
63+
Consumer<T> logSaver,
64+
Consumer<Long> cacheUpdater
65+
) {
66+
Meme meme = getMemeBy(memeId);
67+
T log = logFactory.apply(meme);
68+
logSaver.accept(log);
69+
cacheUpdater.accept(memeId);
70+
}
71+
6372
private Meme getMemeBy(Long memeId) {
6473
return memeRepository.findById(memeId).orElseThrow(() -> new MemeWikiApplicationException(MEME_NOT_FOUND));
6574
}

0 commit comments

Comments
 (0)