Ho diverse situazioni in cui ho bisogno di controllare i timeout in un'applicazione tecnica. In un ciclo o come un semplice controllo. Ovviamente, gestire questo è veramente facile , ma nessuno di questi sembra carino.
Per chiarire, ecco un codice C # (Pseudo):
private DateTime girlWentIntoBathroom;
girlWentIntoBathroom = DateTime.Now;
do
{
// do something
} while (girlWentIntoBathroom.AddSeconds(10) > DateTime.Now);
o
if (girlWentIntoBathroom.AddSeconds(10) > DateTime.Now)
MessageBox.Show("Wait a little longer");
else
MessageBox.Show("Knock louder");
Ora mi sono ispirato a qualcosa che ho visto in Ruby su StackOverflow :
Ora mi chiedo se questo costrutto può essere reso più leggibile usando i metodi di estensione. Il mio obiettivo è qualcosa che può essere letto come
“If girlWentIntoBathroom is more than 10 seconds ago”
1 ° tentativo
if (girlWentIntoBathroom > (10).Seconds().Ago())
MessageBox.Show("Wait a little longer");
else
MessageBox.Show("Knock louder");
Quindi ho scritto un'estensione per intero che converte il numero intero in un TimeSpan
public static TimeSpan Seconds(this int amount)
{
return new TimeSpan(0, 0, amount);
}
Dopodiché, ho scritto un'estensione per TimeSpan in questo modo:
public static DateTime Ago(this TimeSpan diff)
{
return DateTime.Now.Add(-diff);
}
Questo funziona bene finora, ma ha un grande svantaggio. La logica è invertita! Poiché girlWentIntoBathroom è un timestamp nel passato, il lato destro dell'equazione deve contare all'indietro: impossibile. Basta invertire l'equazione non è una soluzione, perché invertirà anche la frase di lettura.
Secondo tentativo
Così ho provato qualcosa di nuovo:
if (girlWentIntoBathroom.IsMoreThan(10).SecondsAgo())
MessageBox.Show("Knock louder");
else
MessageBox.Show("Wait a little longer");
IsMoreThan () deve trasportare il timestamp passato e l'estensione per l'estensione SecondsAgo (). Potrebbe essere:
public static DateWithIntegerSpan IsMoreThan(this DateTime baseTime, int span)
{
return new DateWithIntegerSpan() { Date = baseTime, Span = span };
}
Dove DateWithIntegerSpan è semplicemente:
public class DateWithIntegerSpan
{
public DateTime Date {get; set;}
public int Span { get; set; }
}
E SecondsAgo () è
public static bool SecondsAgo(this DateWithIntegerSpan dateAndSpan)
{
return dateAndSpan.Date.Add(new TimeSpan(0, 0, dateAndSpan.Span)) < DateTime.Now;
}
Utilizzando questo approccio, la frase inglese corrisponde al comportamento previsto. Ma lo svantaggio è che ho bisogno di una classe d'aiuto (DateWithIntegerSpan).
Qualcuno ha un'idea per rendere il timeout dei controlli più carino e più vicino a una frase leggibile? Sono un po 'troppo pazzo pensando a qualcosa di minore come questo?