Merci à Riduidel pour le lien.
Je reprends l'exemple que j'avais donné ici et que j'ai modifié pour le "Yegorifier".
#![allow(non_snake_case)]
// Interface / Trait
trait Addition {
fn add(&self) -> i32;
}
// Couple
struct Couple {
opA: i32,
opB: i32,
}
impl Couple {
// Équivalent à une méthode 'static' de Java simulant un constructeur
fn new(opA: i32, opB: i32) -> Self {
return Couple { opA: opA, opB: opB }
}
}
// Triplet
struct Triplet {
opA: Box<dyn Addition>, // Un trait doit être passé dans un objet de type Box
opB: i32,
}
impl Triplet {
// Équivalent à une méthode 'static' de Java simulant un constructeur
fn new(opA: Box<dyn Addition>, opB: i32) -> Self {
return Triplet { opA: opA, opB: opB }
}
}
// Implémentations du trait "Addition"
impl Addition for Couple {
fn add(&self) -> i32 {
return self.opA + self.opB;
}
}
impl Addition for Triplet {
fn add(&self) -> i32 {
return (*self.opA).add() + self.opB;
}
}
// Exécution
fn main() {
let additionA = Couple::new(1, 2);
println!("Couple add : [{}]", additionA.add()); // Print 3
// Ne pas oublier de wrapper Couple dans une Box
let additionB = Triplet::new(Box::new(additionA), 3);
println!("Triplet add : [{}]", additionB.add()); // Print 6
}
Remarque :
- Le concept de cache ici pose problème puisque des méthodes qui transforment (à base de verbes) retournent en réalité quelque chose.
- Les méthodes avec des boolean ont des verbes, c'est une exception à la Yegorification du code.
// Usage :
object Main {
fun regularUseCase() {
// Given
val christmas = LocalDate(2019, 12, 25)
val calendar:HolidaysCalendar = HolidaysCalendarForYear(Year(2019))
// When
val daysOff:DateSet = calendar.daysOff()
// Then
println(daysOffs.contains(christmas)) // print true
}
fun cachedUseCase() {
// Given
val christmas = LocalDate(2019, 12, 25)
val cache:Cache = HolidaysCalendarCache()
// When
val daysOff2:HolidaysCalendar = cache.value(Year(2019))
val daysOff3:HolidaysCalendar = cache.value(Year(2019))
// Then
println(daysOff2.contains(christmas)) // print true
println(daysOff2 === daysOff3) // print true (same instance)
}
@JvmStatic
fun main() {
val main = Main()
main.regularUseCase()
main.cachedUseCase()
}
}
// Interfaces
interface DateSet {
/**
* Determine whether or not the specified date is in this set.
*
* @param date
* The date to research.
*
* @return true if the date exists in this set, false otherwise.
*/
fun contains(date:LocalDate):Boolean
/**
* Determine whether or not the specified date is in this set.
*
* @param date
* The date to research.
*
* @return true if the date exists in this set, false otherwise.
*/
fun contains(date:Calendar):Boolean
/**
* Return the current set of date as an iterable collection.
*
* @return A collection having all the date stored in this set.
*/
fun asCollection():Collection<LocalDate>
}
interface HolidaysCalendar {
/**
* Return a set of holiday dates.
*
* @return All holidays for a period (see implementation for more detail).
*/
fun daysOff():DateSet
/**
* The period covered by this calendar.
*
* @return Something in the CalenadrPeriod enumeration.
*/
fun range():CalenadrPeriod
}
class Cache<K, V> {
/**
* Determine whether or not the specified value exists in this cache.
*
* @param value
* The value to search.
*
* @return true if the value has been found, false otherwise.
*/
fun contains(value:V):Boolean
/**
* Determine whether or not a key exists in this cache.
*
* @param key
* The key to search.
*
* @return true if the key exists, false otherwise (reminder: a key cannot exists if linked to nothing).
*/
fun containsKey(key:K):Boolean
/**
* Retrieve the value related to the specified key.
*
* @param key
* The key related to the researched value.
*
* @return The value related to the given key.
*
* @throw UnexistingEntryException
* When the subsystem cached by this object is not able to restitute a value using the specified key.
*/
fun value(key:K):V
/**
* The list of keys used by this cache.
*
* @return The list of keys used by this cache.
*/
fun keys():List<K>
/**
* Remove the specified key in order to force an update.
*
* @param key
* The key of the cache entry to remove.
*/
fun remove(key:K)
/**
* Clear all entry is the current cache.
*/
fun reset()
}
// Implementation of HolidaysCalendar
class HolidaysCalendarForYear(private val year:Year):HolidaysCalendar
class HolidaysCalendarForMonth(private val year:Year, private val month:Month):HolidaysCalendar
// Implementation of Cache
class HolidaysCalendarCache:Cache<Year, HolidaysCalendar>
Pour toi @Lenny ! Nous parlions de trucs & astuces sur l'ergonomie des interfaces, l'article est très succinct mais c'est toujours bon de lire et relire ce genre de choses jusqu'à ce qu'elles deviennent naturelles et évidentes.
Vous trouverez l'article complet de Google ici !
Je veux jouer à cela ce week-end ! @Chlouchloutte, tu mets ce lien de côté sur ton PC ?
Je suis d'accord
Oula la !! De gros changement dans udev déjà sur Ubuntu (we don't care) mais aussi sur Debian (we don't "don't care" hein). En gros eth0 disparaît au profit d'une nouvelle convention de nommage fixe dans le temps.
Tout ceux qui développent un script udev devraient y penser (Animal, spourtoi).
Plein de template de présentation en HTML5 / CSS3, gratuites et libres !!!
Quelques templates à se mettre sous le coude pour la boîte :
- https://html5up.net/arcana (le basic)
- https://html5up.net/telephasic (celui avec un template utile pour les sociétés)
- https://html5up.net/helios (comme le précédent mais différent)
- https://html5up.net/hyperspace (le minimalist pour avoir un site avec de la gueule en deux trois pages très très vite)
Edit : Je suis retombée accidentellement sur le site de HTML5 UP et je dois dire que je suis vraiment convaincue par les différents thèmes. Je pense qu'il doit être possible de créer une sorte de petit business à partir des modèles, après il faut voir avec la licence créative common.
Un article à troll sur l'usage des frameworks. Ce n'est pas le contenu de l'article qui m'intéresse ici mais le design du site. Je parle pour ton projet Roudoudoutte, dis-moii ce que tu penses de la GUI.