Di PPCG, kita sering menghadapi tantangan King of the Hill , yang mengadu bot kode yang berbeda satu sama lain. Kami tidak suka membatasi tantangan ini hanya dalam satu bahasa, jadi kami melakukan komunikasi lintas platform di atas standar I / O.
Tujuan saya adalah menulis kerangka kerja yang akan dapat digunakan oleh penulis tantangan untuk membuat menulis tantangan ini lebih mudah. Saya datang dengan persyaratan berikut yang ingin saya penuhi:
Tantangan-penulis mampu membuat kelas di mana metode mewakili masing-masing komunikasi yang berbeda . Sebagai contoh, pada tantangan Baik vs Jahat kami , penulis akan membuat
Player
kelas yang memilikiabstract boolean vote(List<List<Boolean>> history)
metode di atasnya.Pengontrol mampu memberikan contoh kelas di atas yang berkomunikasi melalui standar I / O ketika metode yang disebut dipanggil . Yang mengatakan, tidak semua instance dari kelas di atas akan selalu berkomunikasi melalui standar I / O. 3 bot mungkin bot Java asli (yang hanya menimpa
Player
kelas, di mana 2 bot lainnya dalam bahasa lain)Metode tidak akan selalu memiliki jumlah argumen yang sama (juga tidak akan selalu memiliki nilai balik)
Saya ingin penulis tantangan harus melakukan pekerjaan sesedikit mungkin untuk bekerja dengan kerangka kerja saya.
Saya tidak menentang menggunakan refleksi untuk menyelesaikan masalah ini. Saya telah mempertimbangkan mengharuskan penulis tantangan untuk melakukan sesuatu seperti:
class PlayerComm extends Player {
private Communicator communicator;
public PlayerComm(Communicator communicator){
this.communicator = communicator;
}
@Override
boolean vote(List<List<Boolean>> history){
return (Boolean)communicator.sendMessage(history);
}
}
tetapi jika ada beberapa metode, ini bisa menjadi cukup berulang, dan casting konstan tidak menyenangkan. ( sendMessage
dalam contoh ini akan menerima sejumlah variabel Object
argumen, dan mengembalikan Object
)
Apakah ada cara yang lebih baik untuk melakukan ini?
sumber
PlayerComm extends Player
". Apakah semua pendaftar Java memperluasPlayer
, danPlayerComm
kelas ini merupakan adaptor untuk pendatang non-Jawa?Jawaban:
OK jadi hal-hal semacam meningkat dan saya berakhir dengan sepuluh kelas berikut ...
Intinya dalam metode ini adalah bahwa semua komunikasi terjadi menggunakan
Message
kelas, yaitu permainan tidak pernah memanggil metode pemain secara langsung tetapi selalu menggunakan kelas komunikator dari kerangka Anda. Ada komunikator berbasis refleksi untuk kelas Java asli dan kemudian harus ada komunikator khusus untuk semua pemain non-Jawa.Message<Integer> message = new Message<>("say", Integer.class, "Hello");
akan menginisialisasi pesan ke metode bernamasay
dengan parameter"Hello"
mengembalikan sebuahInteger
. Ini kemudian diteruskan ke komunikator (dihasilkan menggunakan pabrik berdasarkan tipe pemain) yang kemudian mengeksekusi perintah.(PS. Kata kunci lain dalam pikiran saya yang tidak dapat saya perbaiki menjadi sesuatu yang bermanfaat saat ini: Pola Perintah , Pola Pengunjung , java.lang.reflect.ParameterizedType )
sumber
Player
tulisanPlayerComm
sama sekali. Sementara antarmuka komunikator melakukan casting otomatis untuk saya, saya masih mengalami masalah yang sama karena harus menulissendRequest()
fungsi yang sama di setiap metode.