国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#編程實踐–幫老婆計算產假方案

2019-11-17 02:50:31
字體:
來源:轉載
供稿:網友

C#編程實踐–幫老婆計算產假方案

2014-10-10 22:57 by 周信達, ... 閱讀, ... 評論, 收藏, 編輯

摘要

今天中午午休時,和老婆聊天,老婆還過幾天就要請產假了,她在網上問我讓我幫她數一下該怎么請假最劃算,老婆是個會過日子的人,面對此種要求我當然義不容辭,不過想到這個問題我的第一反應是:這個怎么可以用數的呢?于是,我開始去了解2014年上海市最新的產假政策規定,大致概況如下:“產假加上晚育假一共128天,其中前面98天是正常產假,其中已經包括國家法定節日和雙休日,后面30天是晚育假,只包含雙休日,不包含國家法定節日,也就是說遇到國家法定節日則假期往后順延”,注意黑體粗字描述,可以知道這里面的精打細算就體現在前面98天的正常產假。我們要做的就是盡量避免正常產假包含太多的國家法定節假日,否則用老婆的話說那就是“虧”了,注意我把“虧”字打引號,我的意思是在生活中我們不必太過于精打細算斤斤計較,如果過度了那么就容易失去生活情趣和心靈的自由,有句話說吃虧是福。但是,在不妨礙這種前提條件下,我們還是要努力爭取,扯遠了,這個問題又不復雜,所以,我何樂而不為呢?況且,最近已經準備開始寫博了,經常看書看文章看博客,畢竟,紙上得來終覺淺,絕知此事要躬行,還是要經常實踐實踐,況且作為干這一行的,更要有開放和分享的心態,好了,廢話已經很多了,開始代碼的構思和實現。

更新

此文已更新,請看這里:C#編程實踐--產假方案優化版

領域

初步定位,這是一個關于時間查詢的應用,模型圍繞時間建立,假期根據月份和日號來表示(公歷和農歷),另需要提供假期規則的定義,如下(DateModels.cs):

using System;using System.Collections.Generic;using System.Globalization;using System.Linq;using System.Text;using System.Threading.Tasks;namespace HelloBaby{    // 這里提供默認的放假集合定義    public static class DefaultHoliday    {        // 元旦1天假        public static readonly Holiday NewYearsHoliday            = new Holiday(MonthDayDate.NewYearsDay, 1);        // 春節3天假,從前一天(除夕)開始放        public static readonly Holiday SPRingFestivalHoliday            = new Holiday(MonthDayDate.SpringFestival, -1, 3);        // 清明1天假        public static readonly Holiday QingMingHoliday            = new Holiday(MonthDayDate.QingMingDay, 1);        // 勞動節1天假        public static readonly Holiday LabourHoliday            = new Holiday(MonthDayDate.LabourDay, 1);        // 端午節1天假        public static readonly Holiday DragonBoatHoliday            = new Holiday(MonthDayDate.DragonBoatFestival, 1);        // 中秋節1天假        public static readonly Holiday MidAutumnHoliday            = new Holiday(MonthDayDate.MidAutumnDay, 1);        // 國慶節3天假        public static readonly Holiday NationalHoliday            = new Holiday(MonthDayDate.NationalDay, 3);        public static List<Holiday> Holidays = new List<Holiday>{            DefaultHoliday.NewYearsHoliday,            DefaultHoliday.SpringFestivalHoliday,            DefaultHoliday.QingMingHoliday,            DefaultHoliday.LabourHoliday,            DefaultHoliday.DragonBoatHoliday,            DefaultHoliday.MidAutumnHoliday,            DefaultHoliday.NationalHoliday        };    }    // 假期,包含3個成員(農歷或公歷幾月幾日?提前幾天放?共放幾天)    public struct Holiday    {        public Holiday(MonthDayDate monthDay, int startOffset, int days)            : this()        {            MonthDay = monthDay;            StartOffset = startOffset;            Days = days;        }        public Holiday(MonthDayDate monthDay, int days)            : this(monthDay, 0, days)        {        }        public MonthDayDate MonthDay { get; private set; }        public int StartOffset { get; set; }        public int Days { get; set; }        // 根據年份獲取假期具體日期枚舉        public IEnumerable<DateTime> ToDateTimeRange(int year)        {            DateTime gregorian = DateTime.Now;            if (MonthDay.Calendar == CalendarKind.LunarCalendar)                gregorian = DateUtility.ConvertLunarYearDate(year, MonthDay.Month, MonthDay.Day);            else                gregorian = new DateTime(year, MonthDay.Month, MonthDay.Day);            DateTime begin = gregorian.AddDays(StartOffset);            for (int i = 0; i < Days; i++)            {                yield return begin.AddDays((double)i);            }        }    }    // 此處使用Calendar屬性來區分歷法    // 也可以將struct改為class使用繼承的設計方式,方便擴展    public struct MonthDayDate    {        // 元旦節        public static readonly MonthDayDate NewYearsDay = new MonthDayDate(1, 1);        // 中國春節        public static readonly MonthDayDate SpringFestival =            new MonthDayDate(1, 1, CalendarKind.LunarCalendar);        // 清明節        public static readonly MonthDayDate QingMingDay = new MonthDayDate(4, 5);        // 五一勞動節        public static readonly MonthDayDate LabourDay = new MonthDayDate(5, 1);        // 端午節        public static readonly MonthDayDate DragonBoatFestival =            new MonthDayDate(5, 5, CalendarKind.LunarCalendar);        // 中秋節        public static readonly MonthDayDate MidAutumnDay =            new MonthDayDate(8, 15, CalendarKind.LunarCalendar);        // 國慶節        public static readonly MonthDayDate NationalDay =            new MonthDayDate(10, 1);        public MonthDayDate(int month, int day, CalendarKind calendar)            : this()        {            Month = month;            Day = day;            Calendar = calendar;        }        public MonthDayDate(int month, int day)            : this(month, day, CalendarKind.Gregorian)        {        }        public int Month { get; private set; }        public int Day { get; private set; }        public CalendarKind Calendar { get; private set; }        public static bool Operator ==(MonthDayDate d1, MonthDayDate d2)        {            return d1.Month == d2.Month                && d1.Day == d2.Day                && d1.Calendar == d2.Calendar;        }        public static bool operator !=(MonthDayDate d1, MonthDayDate d2)        {            return !(d1 == d2);        }    }    public enum CalendarKind    {        // 公歷(陽歷)        Gregorian,        // 中國農歷(陰歷)        LunarCalendar    }}

注意,在Model里面,我們添加了業務邏輯,比如Holiday的ToDateTimeRange方法里面依賴了外部的農歷到公歷的轉換邏輯,這里依賴了外部邏輯,是否屬于不良好的設計?于是我有必要聲明,此代碼為半實驗性代碼,非生產代碼。既然此處依賴一些外部方法邏輯,那么我也把這部分代碼列出(DateUtility.cs):

using System;using System.Collections.Generic;using System.Globalization;using System.Linq;using System.Text;using System.Threading.Tasks;namespace HelloBaby{    public class DateUtility    {        /// <summary>        /// 獲取時間段枚舉        /// </summary>        public static IEnumerable<DateTime> RangeDay(DateTime starting, DateTime ending)        {            for (DateTime d = starting; d <= ending; d = d.AddDays(1))            {                yield return d;            }        }        /// <summary>        /// 農歷轉公歷        /// </summary>        public static DateTime ConvertLunarYearDate(int year, int month, int day)        {            ChineseLunisolarCalendar calendar = new ChineseLunisolarCalendar();            return calendar.ToDateTime(year, month, day, 0, 0, 0, 0);        }    }}

業務

程序寫到這里已經完成了一大半了,接下來就是一些判斷的規則邏輯,這里使用擴展方法來實現(DateExtensions.cs):

using System;using System.Collections.Generic;using System.Globalization;using System.Linq;using System.Text;using System.Threading.Tasks;namespace HelloBaby{    public static class DateExtensions    {        /// <summary>        /// 判斷日期是否是節假日,使用默認放假規定        /// </summary>        public static bool IsHoliday(this DateTime date)        {            return date.IsHoliday(DefaultHoliday.Holidays);        }        /// <summary>        /// 判斷日期是否是節假日,使用指定放假規定        /// </summary>        public static bool IsHoliday(this DateTime date, IEnumerable<Holiday> holidays)        {            return holidays.Any(                d => d.ToDateTimeRange(date.Year).Contains(date)                );        }    }    }

提示:在項目的實踐中,我們盡量遵循TDD的開發模式,尤其是針對業務處理層的代碼,單元測試代碼這里就不貼了,省略掉。

應用

好了,至此我們的領域和業務規則部分已經完成了,可以開始我們的應用了,在一個以數據為中心的年代,有了數據,我們就可以發揮想象,為所欲為,在這里我還是簡單的回到最初的問題點上,因為雖然借此機會練練手寫寫代碼,但初衷還是要幫老婆解決問題啊,于是我的應用場景為計算98天產假里面包含的國家法定節日,我在此主要使用LINQ查詢:

internal static void PrintSol
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 霍林郭勒市| 江油市| 错那县| 霍城县| 井陉县| 维西| 彭山县| 新宁县| 山西省| 十堰市| 巩义市| 洪雅县| 桑日县| 台前县| 万载县| 青海省| 会宁县| 隆德县| 博爱县| 黔东| 达拉特旗| 泽普县| 石屏县| 叶城县| 灵璧县| 梁河县| 张家界市| 股票| 天等县| 阿坝县| 保靖县| 承德市| 青神县| 德惠市| 星座| 克拉玛依市| 阿坝| 宜兰县| 横山县| 宜川县| 罗江县|