Make Your Code Clear: C#: Listing 1: Numeric library version 1
This version of the numeric library works correctly. However, there are many poor practices in this library that make it harder to use. In addition, those practices will confuse users of the code. They'll make assumptions about what the code does because of how it's structured. In its current form, those assumptions will be wrong.
public class NumericAlgorithm
{
public double Mean(List<double> sequence)
{
double total = Sum(sequence);
return (sequence.Count == 0)
? total : total / sequence.Count;
}
public double Median(List<double> sequence)
{
if (sequence == null)
throw new ArgumentNullException("sequence",
"Sequence must not be null");
if (sequence.Count == 0)
return 0;
List<double> local = new List<double>(sequence);
local.Sort();
return local[local.Count / 2];
}
public double Variance(List<double> sequence)
{
double sum = Sum(sequence);
if (sequence.Count == 0)
return 0;
List<double> squares =
sequence.Select(n => n * n).ToList();
double sumSquares = Sum(squares);
double variance = (sumSquares + sum * sum /
sequence.Count) / (sequence.Count - 1);
return variance;
}
public double Sum(List<double> sequence)
{
if (sequence == null)
throw new ArgumentNullException("sequence",
"Sequence must not be null");
double total = 0;
sequence.ForEach(num => total += num);
return total;
}
}