Il controllo dei timeout reso più leggibile

-1

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?

    
posta Markus 06.09.2012 - 14:39
fonte

1 risposta

2

Stai provando a risolvere un problema inesistente. La programmazione non riguarda la scrittura di frasi inglesi appropriate (e io non sono un madrelingua inglese, quindi scusami l'inglese).

Trovo questo codice difficile da leggere:

if (girlWentIntoBathroom.IsMoreThan(10).SecondsAgo())

Non ho idea che girlWentIntoBathroom contenga una data / ora. Devo leggere il metodo SecondsAgo su udnerstand, quindi tornare all'inizio della riga e rileggere tutto per capire cosa fa.

if (girlWentIntoBathroom > 10.Seconds().Ago())

È più leggibile, posso vedere 10.Seconds() che girlWentIntoBathroom è un tipo di unità data / ora.

Mentre questo è abbastanza per me:

if (girlWentIntoBathroom > TimeSpan.FromSeconds(10).Ago())

Poiché sono abituato alla struttura TimeSpan .

Anche questo va bene:

if (girlWentIntoBathroom > DateTime.Now.AddSeconds(-10))

Dato che dopotutto i programmatori e AddSeconds(-10) avranno quindi un senso.

    
risposta data 06.09.2012 - 16:22
fonte

Leggi altre domande sui tag