1.外文资料翻译译文
第十四章 实例方法
一年之中从开始到某个特定的日期,计算这段时间的价值,是Date的一个常见任务。这个工作其中的一部分是决定某一年是否是闰年,请见以下:
static bool IsLeapYear(int year)
{
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
第十一章就演示了忽视闰年的DayOfYear方法。那个方法是用命名为daysCumulative的静止的排列来简化工作:
static int[] daysCumulative = { 0, 31, 59, 90, 120, 151,
181, 212, 243, 273, 304, 334 };
static int DayOfYear(int month, int day)
{
return daysCumulative[month - 1] + day;
}
正如我们在那章发现的,把初始数组宣称为静止字段比局部变量更好,那样就只需初始化一次。
考虑到闰年,用DayOfYear方法想当容易改变。必要的是当遇到闰年,月份是3月或者更晚的时候,需要加一个1:
static int DayOfYear(int year, int month, int day)
{
return daysCumulative[month - 1] + day +
(month > 2 && IsLeapYear(year) ? 1 : 0);
}
要注意的是,必需增加一个额外的参数作为年,这个方法是利用了IsLeapYear方法。
然而,我们之前决定把日期作为单一实体可能是最好的处理方法,其中一个原因是为了避免像DayOfYear一样,有三个参数。输入日期的时候只有一个参数会更好。
static int DayOfYear(Date dateParam)
{
return daysCumulative[dateParam.month - 1] + dateParam.day +
(dateParam.month > 2 && IsLeapYear(dateParam.year) ? 1 : 0);
}
现在,按照这个方法,它不是指的年,月,日的参数,而指的是dateParam.year, dateParam.month, 和dateParam.day。不幸的是,简化参数列表却让这个方法看起来更复杂了。别担心,在本章结束之前,它就会退缩回来变小。
让我们把所有这些任务放到一个工作程序里。这个程序叫做StructureAndMethodsOne,是因为它在从传统编程演变到对象编程的三个部分的系列中是第一个。这个程序把Date作为一个构成,但在本章中,没什么要取决于它。你可以把它改成一个类,本章中的所有程序将不受影响。
StructureAndMethodsOne.cs
//-------------------------------------------------------
// StructureAndMethodsOne.cs (c) 2006 by Charles Petzold
//-------------------------------------------------------
using System;
struct Date
{
public int year;
public int month;
public int day;
}
class StructureAndMethodsOne
{
static void Main()
{
Date dateMoonWalk = new Date();
dateMoonWalk.year = 1969;
dateMoonWalk.month = 7;
dateMoonWalk.day = 20;
Console.WriteLine("Moon walk: {0}/{1}/{2} Day of Year: {3}",
dateMoonWalk.month,dateMoonWalk.day,dateMoonWalk.year, DayOfYear(dateMoonWalk));
}
static bool IsLeapYear(int year)
{ return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); }
static int[] daysCumulative = { 0, 31, 59, 90, 120, 151,
181, 212, 243, 273