Context
Salut pour mettre un peu de context, je code depuis un bon moment maintenant (c, c++, et un peu kotlin/java) et la je veux m'exercer a 'bien' coder, un code le plus opti, lisible, facile a utiliser et maintenir. Du coup ce que je vais demander la c'est peut-etre un peu du chipotage a certains moments.
Probleme
Dans ma configuration.yml j'ai des messages
je veux pouvoir acceder et envoyer des messages, depuis n'importe ou dans le code, sachant qu'ils peuvent avoir des tags (example %player% qui sera remplacer par le joueur (predefini)). Le message peut-etre destine a la console.
Le message de la configuration peut-etre:
Solution
Pour réaliser ça, j'ai opté pour l'Enum suiavnte
L'Enum contient la fonction static principal suivante (ignorer Component pour le moment)
Et ici, j'ai déjà un problème, au total, j'effectue 3 if (sans Component et en comptant ?: comme un if) à chaque fois que je veux envoyer un message, imaginez que le message est envoyé de maniere global à tout le serveur et que comme par hasard il y a pile 999joueurs sur le (unique) serveur, ça en fait des vérifications pour un pauvre message.. Je suis obligé de vérifier le retour de getStringList, lequel ne récupère pas le contenu si c'est un string simple, donc pour m'assurer que c'est pas un String simple, je dois vérifier et effectuer getString, mais je dois quand même vérifier que le message suite à getString n'est pas vide (si l'utilisateur à supprimer la ligne ou n'a rien mis). Bref, je n'aime pas ce code. La seule alternative que j'ai trouve c'est peut-être de faire une map au start du serveur avec tous les messages enregistrés 1 seule fois au démarrage (avis?).
Ensuite, pour les Component, lesquels gèrent donc les tags j'ai l'enum ainsi que l'objet suivant (dans le meme fichier Message.kt)
Donc au final, ma fonction sendMessage, en admettant qu'il y a un ou plusieurs component et appele comme ceci:
Puis message a un builder (buildMessageComponent) qui effectuera
L'utilisation est assez simple, mais je suis quand même sceptique, je sais pas trop pourquoi enfaite, si quelqu'un a une meilleure manière de gérer les choses je suis preneur.
Salut pour mettre un peu de context, je code depuis un bon moment maintenant (c, c++, et un peu kotlin/java) et la je veux m'exercer a 'bien' coder, un code le plus opti, lisible, facile a utiliser et maintenir. Du coup ce que je vais demander la c'est peut-etre un peu du chipotage a certains moments.
Probleme
Dans ma configuration.yml j'ai des messages
Code:
messages:
mon_message: "&esalut %tag%"
Le message de la configuration peut-etre:
- Un simple string (voir plus haut)
- Une list :
Code:
mon_message:
- "&esalut %tag%"
- "&eligne 2"
- Rien si l'user a supprimer la ligne..
- Rien si l'user a indiquer un message vide
Code:
mon_message: ""
Solution
Pour réaliser ça, j'ai opté pour l'Enum suiavnte
Code:
enum class Message(val path: String) {
TARGET_MSG("path.to_the_message"),
...
}
L'Enum contient la fonction static principal suivante (ignorer Component pour le moment)
Java:
fun sendMessage(player: Player?, msg: Message, component: ComponentObj?) {
var messageList: MutableList<String>? = fileManager.getStringListFromFile(FileType.MESSAGE, msg.path) //Cette fonction utilisera getStringList de org.bukkit.configuration.file
if (messageList.isNullOrEmpty()) //getStringList est null ou vide ?
messageList = mutableListOf(fileManager.getStringFromFile(FileType.MESSAGE, msg.path) ?: return) //Cette fonction utilisera getString de org.bukkit.configuration.file
if (messageList.isEmpty()) //Le message est quand meme vide ?
return
if (component != null)
buildMessageComponent(messageList, component)
messageSender(player, messageList)
}
Ensuite, pour les Component, lesquels gèrent donc les tags j'ai l'enum ainsi que l'objet suivant (dans le meme fichier Message.kt)
Code:
enum class ComponentEnum(val tag: String) {
PLAYER("%player%"),
...
}
class ComponentObj(val compoEnum: List<ComponentEnum>, val values: List<String>)
Code:
Message.sendMessage(playerVar, Message.MY_MESSAGE, ComponentObj(listOf(ComponentEnum.PLAYER), listOf(playerVar.name)))
Java:
private fun buildMessageComponent(messageList: MutableList<String>, component: ComponentObj) {
messageList.indices.forEach { i ->
if (messageList[i].contains('%')) { //Si la ligne ne contient meme pas un % ce n'est pas la peine de continuer
component.values.indices.forEach { x ->
messageList[i] = messageList[i].replace(component.compoEnum[x].tag, component.values[x])
}
}
}
}