Praktikum Pemrograman Berorientasi Objek
Modul 3 – Polymorphism & Abstraction
Case Study
Catatan Penting
❖ Pastikan codingan kalian dapat di compile sebelum melakukan commit dan push ke
remote repository.
❖ Untuk semua ‘findBy…’ gunakan Optional<>
1. Pada Root Directory yang sama dengan Model, buatlah package bernama ‘Repository’!
2. Buatlah Abstract Class ‘BaseRepository<T, ID>’ dengan ketentuan;
a. Attribute:
● ‘Map’ dengan tipe data HashMap<ID, T>
● ‘List’ dengan tipe data ArrayList<T> dan bersifat protected
b. Method;
● findById(ID id) yang berfungsi untuk mengembalikan data bedasar ID. Method akan
mengembalikan object bertipe T yang ada.
● findAll() yang berfungsi untuk mengembalikan seluruh data
c. Selain itu, buat juga Abstract Method;
● save(T entity) yang menerima objek entity bertipe T dan tidak mengembalikan
apapun.
● getId(T entity) yang menerima objek entity bertipe T dan mengembalikan ID.
Dimana keduanya akan diimplementasikan dalam subclass.
1
3. Buatlah Class ‘PlayerRepository<Player, UUID>’ dengan ketentuan;
a. Merupakan pewaris dari BaseRepository
b. Mengimport Player dari model
c. Memiliki Method;
● findByUsername(String username) yang berfungsi untuk mencari Player berdasar
Usernamenya. Untuk kodenya, bisa meng-copy kode di bawah;
public Optional<Player> findByUsername(String username)
{
return [Link]()
.filter(player ->
[Link]().equals(username))
.findFirst();
}
● findTopPlayersByHighScore(int limit) yang mengembalikan Player dengan
highscore tertinggi sebanyak input limit yang diminta. HINT: gunakan sorted()
● findByHighscoreGreaterThan(int minScore) yang mengembalikan Player dengan
score lebih besar dibanding input minScore yang diminta
● findAllByOrderByTotalCoinsDesc() yang mengembalikan semua Player diurut
berdasar coins yang dimiliki. HINT: gunakan compareTo()
● findAllByOrderByTotalDistanceTravelledDesc() yang mengambalikan semua
Player diurutkan berdasar Distance yang ditempuh.
● save(Player player) yang mengoverride superclassnya
● getId(Player entity) yang mengoverride superclassnya
4. Buatlah Class ‘ScoreRepository’ dengan ketentuan;
a. Merupakan pewaris dari BaseRepository
b. Mengimport Score dari model
c. Memiliki method;
● findByPlayerId(UUID playerId) yang berfungsi untuk mengembalikan Player
berdasar input playerID yang diminta.
● findByPlayerIdOrderByValueDesc(UUID playerId) yang berfungsi untuk
mengembalikan semua score player dari yang terbesar ke yang terkecil
2
● findTopScores(int limit) yang mengembalikan score tertinggi.
● findHighestScoreByPlayerId(UUID playerId) yang mengembalikan highscore
Player yang diminta.
● findByValueGreaterThan(Integer minValue) yang mengembalikan score yang
lebih tinggi dibanding input minScore.
● findAllByOrderByCreatedAtDesc() yang mengembalikan semua score berdasar
kapan score dibuat.
● getTotalCoinsByPlayerId(UUID playerId) yang mengembalikan semua coins yang
dimiliki oleh Player yang diminta. Untuk kodenya, bisa meng-copy kode berikut;
public Integer getTotalCoinsByPlayerId(UUID playerId) {
return [Link]()
.filter(score ->
[Link]().equals(playerId))
.mapToInt(Score::getCoinsCollected)
.sum();
}
● getTotalDistanceByPlayerId(UUID playerId) yang mengembalikan total Distance
Player yang diminta.
● save(Score score)
● getId(Score entity)
5. Jalankan Main dan tunjukkan outputnya! Gunakanlah class Main seperti berikut dan isi kode merah
dengan kode anda!
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class Main {
public static void main(String[] args) {
PlayerRepository playerRepo = new PlayerRepository();
ScoreRepository scoreRepo = new ScoreRepository();
Player player1 = new Player("Stelle");
Player player2 = new Player("gamerLooxmaxxing");
Player player3 = new Player ("Stelle123");
3
Player player4 = new Player ("Banananana");
// Buat dan simpan player
[Link](1500);
[Link](250);
[Link](5000);
[Link](3200);
[Link](750);
[Link](12000);
// Buat update stats untuk player 3 dan 4 (bebas)
// Buat dan simpan nilai dengan ketentuan;
// Score 1: Untuk player 2, memiliki score 1500, coins
250, dan distance 5000
// Score 2: Untuk Player 4, memiliki score 3200, coins
750, dan distance 12000
// Score 3: Untuk Player 1, memiliki score 4000, coins
400, dan distance 32000
// Score 4: Untuk Player 4, memiliki score 1800, coins
300, dan distance 6000
// Score 5: Untuk Player 3, memiliki score 2400, coins
240, dan distance 2400
// Score 6: Untuk Player 2, memiliki score 6200, coins
320, dan distance 5000
// Score 7: Untuk Player 4, memiliki score 1800, coins 60,
dan distance 1200
// Score 8: Untuk Player 1, memiliki score 2100, coins
200, dan distance 7000
// Score 9: Untuk Player 1, memiliki score 8000, coins
720, dan distance 6200
// Score 10: Untuk Player 3,memiliki score 1900, coins
210, dan distance 4200
[Link]("=== TESTING CS3 ===");
[Link]("Find player by ID:");
// Tunjukkan detail Player 3
[Link]("All players:");
// Tunjukkan semua player
// Urutkan player berdasar highscore
[Link]("Scores for player1:");
// Cari Score Player 1
4
}
}
6. Berikan screenshot output yang membuktikan jawaban kamu!
a. Siapakah yang memiliki score tertinggi, dan berapa score-nya?
b. Siapa yang paling banyak memainkan permainan ini?
c. Siapa pemilik score terendah, dan berapa score-nya?
d. Apakah saat ini kamu bisa membuat akun dan menjadi salah satu pemainnya? Jelaskan
alasanmu!
7. Screenshot output yang didapat dan push beserta kode yang kamu buat ke Repository
masing-masing!
Contoh Output!