Monday, February 26, 2018 / DeveloperTools CodeSearch

Git Short Code

Git Content

The Freeze Team Blog

Build Status

Please join our Discord server

Git Code

    public Task<List<TvShowEntity>> GetTvShowList()
    {
        return Task.FromResult(aDatabase.TvShowEntities.Include("TvShowWithGenres").ToList());
    }
    public bool Create(TvShowEntity tvShowModel)
    {
        if(tvShowModel != null)
        {
            aDatabase.TvShowEntities.Add(tvShowModel);
            Result = aDatabase.SaveChanges();
        }
        if (Result >= 0)
        {
            return true;
        } else
        {
            return false;
        }
    }
    public Task<TvShowEntity> GetTvShowById(int Id)
    {
        TvShowModel = aDatabase.TvShowEntities.Include("TvShowWithGenres").SingleOrDefault(t => t.Id == Id);
        return Task.FromResult(TvShowModel);
    }
    public Task<bool> RemoveTvshow(int Id)
    {
        TvShowModel = aDatabase.TvShowEntities.Find(Id);
        if(TvShowModel != null)
        {
            aDatabase.TvShowEntities.Remove(TvShowModel);
            aDatabase.SaveChanges();
            return Task.FromResult(true);
        }
        else
        {
            return Task.FromResult(false);
        }
    }

    public bool SaveBulkTvShowGenre(TvShowEntity tvShowModel, List<string> GenreIdList)
    {
        foreach (var eachGenreId in GenreIdList)
        {
            TvShowWithGenreList.Add(new TvShowWithGenre { TvShowEntityId = tvShowModel.Id, TvShowGenreId = Convert.ToInt32(eachGenreId)});
        }
        if(TvShowWithGenreList != null)
        {
            aDatabase.TvShowWithGenres.AddRange(TvShowWithGenreList);
            aDatabase.SaveChanges();
            return true;
        } else
        {
            return false;
        }
    }
    public Task<bool> UpdateTvShow(TvShowEntity tvShowModel, List<TvShowGenre> newSelectGenreList)
    {
        List<TvShowWithGenre> GenreRemoveList = new List<TvShowWithGenre>();
        Dictionary<int, int> tvshowWithGenreMapById = new Dictionary<int, int>();
        Dictionary<int, int> tvshowGenreInDbMapById = new Dictionary<int, int>();
        TvShowEntity tvshowInDb = aDatabase.TvShowEntities.SingleOrDefault(s => s.Id == tvShowModel.Id);
        List<TvShowWithGenre> genreDb = aDatabase.TvShowWithGenres.Where(s => s.TvShowEntityId == tvShowModel.Id).ToList();
        List<TvShowWithGenre> ToRemoveTvshowWithGenre = new List<TvShowWithGenre>();
        List<TvShowWithGenre> ToAddTvshowWithGenre = new List<TvShowWithGenre>();
        tvshowInDb.NumberOfSeason = tvShowModel.NumberOfSeason;
        tvshowInDb.Sound = tvShowModel.Sound;
        tvshowInDb.Status = tvShowModel.Status;
        tvshowInDb.Title = tvShowModel.Title;
        tvshowInDb.Trailer = tvShowModel.Trailer;
        tvshowInDb.Backdrop_Path = tvShowModel.Backdrop_Path;
        tvshowInDb.Description = tvShowModel.Description;
        tvshowInDb.EpisodeRunTime = tvShowModel.EpisodeRunTime;
        tvshowInDb.FirstAirDate = tvShowModel.FirstAirDate;
        tvshowInDb.NumberOfEpisode = tvShowModel.NumberOfEpisode;
        tvshowInDb.Score = tvShowModel.Score;
        tvshowInDb.VoteCount = tvShowModel.VoteCount;
        tvshowInDb.PublishedDate = tvShowModel.PublishedDate;
        foreach (var eachGenreInDb in genreDb)
        {
            tvshowWithGenreMapById.Add(eachGenreInDb.TvShowGenreId, eachGenreInDb.TvShowEntityId);
        }
        //add new select to list before puting to db.
        foreach (var newGenre in newSelectGenreList)
        {
            if (!tvshowWithGenreMapById.ContainsKey(newGenre.Id))
            {
                //remove list;
                ToAddTvshowWithGenre.Add(new TvShowWithGenre { TvShowEntityId = tvShowModel.Id, TvShowGenreId = newGenre.Id });
            }
            tvshowGenreInDbMapById.Add(newGenre.Id, tvShowModel.Id);
        }
        aDatabase.TvShowWithGenres.AddRange(ToAddTvshowWithGenre);

        foreach (var oldGenre in genreDb)
        {
            if (!tvshowGenreInDbMapById.ContainsKey(oldGenre.TvShowGenreId))
            {
                aDatabase.Entry(oldGenre).State = EntityState.Deleted;
            }

        }
        var resultFirst = aDatabase.SaveChanges();
        if (resultFirst >= 0) 
        { 
            return Task.FromResult(true); 
        } else 
        { 
            return Task.FromResult(false); 
        }
    }

    public async Task<TmdbTvShowModel> FetchTmdbTvShowApi(string movieId, bool isThaiApi)
    {
        var client = new HttpClient();
        var request = new HttpRequestMessage();
        if (isThaiApi){
            request.Method = HttpMethod.Get;
            request.RequestUri = new Uri(string.Format("https://api.themoviedb.org/3/tv/{0}?api_key=09e414c534d47f74def83dd9fa03909c&language=th", movieId));
        } else {
            request.Method = HttpMethod.Get;
            request.RequestUri = new Uri(string.Format("https://api.themoviedb.org/3/tv/{0}?api_key=09e414c534d47f74def83dd9fa03909c", movieId));
        }
        using (var response = await client.SendAsync(request))
        {
            if (response.IsSuccessStatusCode)
            {
                var body = await response.Content.ReadAsStringAsync();
                TmdbTvShow = JsonConvert.DeserializeObject<TmdbTvShowModel>(body);
            } else
            {
                TmdbTvShow = new TmdbTvShowModel { isRequestSucceed = false };
            }
            
            return await Task.FromResult(TmdbTvShow);
        }
    }
    public async Task<Video> FetchTmdbTrailerApi(string movieId)
    {
        var client = new HttpClient();
        var request = new HttpRequestMessage
        {
            Method = HttpMethod.Get,
            RequestUri = new Uri(string.Format("http://api.themoviedb.org/3/tv/{0}/videos?api_key=09e414c534d47f74def83dd9fa03909c", movieId)),
        };
        using (var response = await client.SendAsync(request))
        {
            var body = await response.Content.ReadAsStringAsync();
            TmdbVideoModel = JsonConvert.DeserializeObject<Video>(body);
            Console.WriteLine(body);
            return await Task.FromResult(TmdbVideoModel);
        }
    }
    public Task<int> CountTvShow()
    {
        return Task.FromResult(aDatabase.TvShowEntities.Count());
    }
    public async Task<List<TvShowEntity>> GetTvShowListIndexPage(int pageSize)
    {
        List<TvShowEntity> tvShowList;
        tvShowList = await aDatabase.TvShowEntities.OrderByDescending(c => c.Id).Take(pageSize).ToListAsync();
        return tvShowList;
    }
    public async Task<List<TvShowEntity>> GetMovieListByPage(int pageSize, int pageIndex)
    {
        List<TvShowEntity> tvShowList;
        if (pageIndex == 1) //mean click on page 1.
        {
            tvShowList = await aDatabase.TvShowEntities.OrderBy(c => c.Id).Take(pageSize).ToListAsync();
        }
        else
        {
            tvShowList = await aDatabase.TvShowEntities.OrderBy(c => c.Id).Skip(pageSize * (pageIndex - 1)).Take(pageSize).ToListAsync();
        }
        return tvShowList;
    }

    public async Task<List<TvShowEntity>> SearchByWords(string keywords)
    {
        List<TvShowEntity> tvShowList;
        tvShowList = await aDatabase.TvShowEntities.Where(q => (q.Title).ToLower().Contains(keywords.ToLower())).ToListAsync();
        return tvShowList;
    }
    

Image Content

หากใครที่เขียนโปรแกรมมาสักพักและรู้ว่าเราสามารถเขียนให้มันทำงานได้ตามที่เราต้องการ แต่พอมาดูเรื่องการเทสและการรักษาโค๊ตยังไงให้สะอาดที่สุด การเรียนรู้เรื่อง pattern ต่างๆสามารถช่วยให้เราเขียนโค๊ตได้เป็นระเบียบมากขึ้น และยังทำให้โค๊ตเราสะอาด

ยกตัวอย่างเรามีคลาสชื่อว่า Duck ซึ่งเป็น Base คลาสสำหรับคลาสลูกๆ นั้นก็คือคลาว Wild Duck กับ CityDuck ซึ่งแน่นอนว่าเป็ดยังไงมันก็เป็นเป็ด และมีพฤติกรรมที่เหมือนกันคือ Eat ดังนั้นใน Base คลาส และคลาสลูกก็สามารถที่จะนำเอาเมธตอทนี้ไปใช้ได้ เเล้วหาก Wild Duck มันกินไม่เหมือน City Duck ละ

ง่ายๆ เราก็ override สิแบบเป็ดป่าจะกินอะไรก็ไป implement ในคลาสตัวเองเลย

ปัญหา

ถ้าเรามีคลาสลูกที่เพิ่มขึ้นมา และแต่ละคลาสก็มี Eat เมทตอทที่ไม่เหมือนกันละ ?

แล้วหากในคลาสลูกบางคลาสเช่น Mountain Duck กับ Wild Duck มี Eat เมธตอทที่เหมือนกันละ แต่การสืบทอด คลาสลูกไม่สามารถสืบทอดหรือส่งต่อ Eat ให้กันได้ จำทำยังไงให้เราไม่ต้องเขียน เมธตอท Eat ทั้งในคลาส Mountain Duck กับ Wild Duck?

*บางคนอาจจะคิดว่าเราก็สร้างคลาส abstruct เช่น WildDuckEatBehavior ขึ้นมาเเล้วก็ให้ Mountain Duck กับ Wild Duck สิบทอดมาก็จบ แต่หากว่าคลาาที่มีเมธตอทที่เหมือนกันไมีมีแต่สองคลาสนี้ละ สุดท้ายก็ลงเอยที่ต้องเพิ่ม abstruct เยอะขึ้นมาเลยๆตยยุ่งไปหมด

Strategy Pattern

ก่อนอื่นมาดูความหมายของคนคิด pattern เค้าว่ายังไง

Define a family of algorithms encapsulate each one and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

ตัวอย่างคลาส Mountain Duck กับ Wild Duck มีเมธตอทเหมือนกัน เราจะสร้าง interface ชื่อว่า IEatBehavior เเล้วมี Eat() ประกาศไว้ เเล้วก็จะมี Concret คลาสที่ Implement มธตอทเกี่ยวกับกินของเป็ดเช่น EatVegetable กับ EatMeat อาจจะเพิ่มว่ากินอย่างอื่นได้ตามที่ต้องการ

image info

image info