Рефакторинг и создания отдельных методов


Приведенный ниже код работает без ошибок и никаких проблем.

Однако, я думаю, что это слишком долго, и я хочу переделать его, разделив на три части (как прокомментировал код) путем создания нового метода для каждого из них, так что я могу использовать их позже.

Я пытался отделить часть 2 и создал метод, который берет IQuerayble в качестве параметра, и называется он с makbuzQuery как параметр. Однако, когда это в отдельный метод, метод forEach не видит, что находится внутри интерфейса IQueryable.

Как я могу выполнить рефакторинг этого кода путем создания отдельных методов Часть 1, Часть 2 и Часть 3?

public static IEnumerable MakbuzOlustur(int islemId)
{
    //id si verilen tahsilat işleminin bilgilerini çekiyorm
    //Part 1
    var makbuzQuery = from islem in db.TBLP1ISLEMs
                      where islem.ID == islemId
                      select new
                      {
                        islem.ID,
                        CARIFIRMABIREYADI = islem.TBLP1CARI.K_FIRMAADI == null ||
                                            islem.TBLP1CARI.K_FIRMAADI == "" ?
                                            islem.TBLP1CARI.B_ADSOYAD :
                                            islem.TBLP1CARI.K_FIRMAADI,//SAYIN
                        CARIADRESI = CariAdresAyarla(islem.TBLP1CARI.ID),
                        MAKBUZTARIHI = DateTime.Now.ToShortDateString(),
                        islem.BELGENO,
                        islem.GENELTOPLAM,
                        CARININPARABIRIMI = islem.TBLP1CARI.LISTEPARABIRIMI,
                        islem.PARABIRIMI,
                        YAZIYLA = BAL.para.DataFormat.tutar_to_yazi(DAL.Format.ParaDuzenle.ParaFormatDuzenle(islem.GENELTOPLAM.ToString())),
                        islem.ACIKLAMA,
                        PERSONELADI = BirIsleminPersoneliniBul(islem.ID)
                      };
            //Part 2
    List<Makbuz> makbuzListesi = new List<Makbuz>();

    foreach (var makbuz in makbuzQuery)
    {
        Makbuz makbuzObjesi = new Makbuz();
        //eğer işlemin kuru varsa çekiyorum
        decimal isleminKuru = DovizTuruVerilenBirIsleminDovizKurunuCek(makbuz.ID, makbuz.PARABIRIMI);

        makbuzObjesi.IslemId = makbuz.ID;
        makbuzObjesi.FirmaBireyAdi = makbuz.CARIFIRMABIREYADI;
        makbuzObjesi.Adres = makbuz.CARIADRESI;
        makbuzObjesi.MakbuzTarihi = makbuz.MAKBUZTARIHI;
        makbuzObjesi.BelgeNo = makbuz.BELGENO;
        //carinin para birimi TL ise kur ile çarpmaya gerek yok
        if (makbuz.CARININPARABIRIMI == "TL")
        {
            makbuzObjesi.GenelToplam = makbuz.GENELTOPLAM.Value;
        }
        else
        {
            makbuzObjesi.GenelToplam = (makbuz.GENELTOPLAM * isleminKuru).Value;
        }
        makbuzObjesi.ParaBirimi = "TL";
        makbuzObjesi.Yaziyla = 
                BAL.para.DataFormat.tutar_to_yazi(DAL.Format.ParaDuzenle.ParaFormatDuzenle(makbuzObjesi.GenelToplam.ToString().Replace(',','.')));
        makbuzObjesi.Aciklama = makbuz.ACIKLAMA;
        makbuzListesi.Add(makbuzObjesi);
        makbuzObjesi.PersonelAdi = makbuz.PERSONELADI;

    }
    //Part 3
    var toReport = from makbuzSon in makbuzListesi
                   select new
                   {
                       ID = makbuzSon.IslemId,
                       FIRMABIREYADI = makbuzSon.FirmaBireyAdi,
                       ADRES = makbuzSon.Adres,
                       MAKBUZTARIHI = makbuzSon.MakbuzTarihi,
                       BELGENO = makbuzSon.BelgeNo,
                       GENELTOPLAM = DAL.Format.ParaDuzenle.ParaFormatDuzenle(makbuzSon.GenelToplam.ToString()) + " TL",
                       PARABIRIMI =makbuzSon.ParaBirimi,
                       YAZIYLA = makbuzSon.Yaziyla,
                       ACIKLAMA = makbuzSon.Aciklama,
                       PERSONELADI = makbuzSon.PersonelAdi
                   };

    return toReport;
}

Это именуется класс

public class Makbuz
{
   public int IslemId { get; set; }
   public string FirmaBireyAdi { get; set; }
   public string Adres { get; set; }
   public string MakbuzTarihi { get; set; }
   public string BelgeNo { get; set; }
   public decimal GenelToplam { get; set; }
   public string ParaBirimi { get; set; }
   public string Yaziyla { get; set; }
   public string Aciklama { get; set; }
   public string PersonelAdi { get; set; }
}


447
2
c#
задан 7 июля 2011 в 06:07 Источник Поделиться
Комментарии
6 ответов

Я думаю, что вы столкнулись с фундаментальной проблемой я часто с анонимными типами: они являются анонимными. В C++0х имеет некоторые интересные расширения для получения вида сзади с анонимными типами, хотя я не уверен, что они помогут здесь.

Я предлагаю создать явный тип для замены анонимный тип. Это может привести к ранней оценки вашего запроса.

public class MakbuzQT
{
public int ID;
public string CARIFIRMABIREYADI;
public string CARIADRESI;
public string MAKBUZTARIHI;
public string BELGENO;
public decimal GENELTOPLAM;
public string CARININPARABIRIMI;
public string PARABIRIMI;
public string YAZIYLA;
public string ACIKLAMA;
public string PERSONELADI;
}

Теперь вы можете использовать явное типа рефакторинга запрос:

    public static IEnumerable<MakbuzQT> Part1(int islemId) {
//id si verilen tahsilat işleminin bilgilerini çekiyorm
var makbuzQuery = from islem in db.TBLP1ISLEMs
where islem.ID == islemId
select new MakbuzQT {
ID = islem.ID,
CARIFIRMABIREYADI = islem.TBLP1CARI.K_FIRMAADI == null ||
islem.TBLP1CARI.K_FIRMAADI == "" ?
islem.TBLP1CARI.B_ADSOYAD :
islem.TBLP1CARI.K_FIRMAADI,//SAYIN
CARIADRESI = CariAdresAyarla(islem.TBLP1CARI.ID),
MAKBUZTARIHI = DateTime.Now.ToShortDateString(),
BELGENO = islem.BELGENO,
GENELTOPLAM = islem.GENELTOPLAM,
CARININPARABIRIMI = islem.TBLP1CARI.LISTEPARABIRIMI,
PARABIRIMI = islem.PARABIRIMI,
YAZIYLA = BAL.para.DataFormat.tutar_to_yazi(DAL.Format.ParaDuzenle.ParaFormatDuzenle(islem.GENELTOPLAM.ToString())),
ACIKLAMA = islem.ACIKLAMA,
PERSONELADI = BirIsleminPersoneliniBul(islem.ID)
};

return makbuzQuery;
}

public static List<Makbuz> Part2(IEnumerable<MakbuzQT> q) {
var ans = new List<Makbuz>();

foreach (var makbuz in q) {
Makbuz makbuzObjesi = new Makbuz();
//eğer işlemin kuru varsa çekiyorum
decimal isleminKuru = DovizTuruVerilenBirIsleminDovizKurunuCek(makbuz.ID, makbuz.PARABIRIMI);

makbuzObjesi.IslemId = makbuz.ID;
makbuzObjesi.FirmaBireyAdi = makbuz.CARIFIRMABIREYADI;
makbuzObjesi.Adres = makbuz.CARIADRESI;
makbuzObjesi.MakbuzTarihi = makbuz.MAKBUZTARIHI;
makbuzObjesi.BelgeNo = makbuz.BELGENO;
//carinin para birimi TL ise kur ile çarpmaya gerek yok
if (makbuz.CARININPARABIRIMI == "TL") {
makbuzObjesi.GenelToplam = makbuz.GENELTOPLAM;
}
else {
makbuzObjesi.GenelToplam = (makbuz.GENELTOPLAM * isleminKuru);
}
makbuzObjesi.ParaBirimi = "TL";
makbuzObjesi.Yaziyla = BAL.para.DataFormat.tutar_to_yazi(DAL.Format.ParaDuzenle.ParaFormatDuzenle(makbuzObjesi.GenelToplam.ToString().Replace(',', '.')));
makbuzObjesi.Aciklama = makbuz.ACIKLAMA;
makbuzObjesi.PersonelAdi = makbuz.PERSONELADI;

ans.Add(makbuzObjesi);
}

return ans;
}

public static IEnumerable MakbuzOlustur(int islemId) {
List<Makbuz> makbuzListesi = Part2(Part1(islemId));

//Part 3
var toReport = from makbuzSon in makbuzListesi
select new {
ID = makbuzSon.IslemId,
FIRMABIREYADI = makbuzSon.FirmaBireyAdi,
ADRES = makbuzSon.Adres,
MAKBUZTARIHI = makbuzSon.MakbuzTarihi,
BELGENO = makbuzSon.BelgeNo,
GENELTOPLAM = DAL.Format.ParaDuzenle.ParaFormatDuzenle(makbuzSon.GenelToplam.ToString()) + " TL",
PARABIRIMI = makbuzSon.ParaBirimi,
YAZIYLA = makbuzSon.Yaziyla,
ACIKLAMA = makbuzSon.Aciklama,
PERSONELADI = makbuzSon.PersonelAdi
};

return toReport;
}

Часть3 будет иметь тот же вопрос, и вы можете создать явный тип, если вы хотите рефакторинг запрос в другой метод в том же образом, как и 2 часть.

Я бегу в это совсем немного и еще, чтобы найти то, что я думаю, является удовлетворительным решением, так что я в конечном итоге создание вместо явных типов.

7
ответ дан 26 июля 2011 в 01:07 Источник Поделиться

Ну это бросилось мне в глаза, как относительно легкая вещь, чтобы вырваться наружу. Редактировать: не уверен, что тип данных на makbuzQuery тип -- отсюда и тип данных параметра новой функции

//Part 2 -- change to
List<Makbuz> makbuzListesi = getMakbuzList(makbuzQuery);

//new function
List<Makbuz> getMakbuzList(makbuzQueryType makbuzQuery)
{
List<Makbuz> makbuzListesi = new List<Makbuz>();
foreach (var makbuz in makbuzQuery)
{
Makbuz makbuzObjesi = new Makbuz();
//eğer işlemin kuru varsa çekiyorum
decimal isleminKuru = DovizTuruVerilenBirIsleminDovizKurunuCek(makbuz.ID, makbuz.PARABIRIMI);

makbuzObjesi.IslemId = makbuz.ID;
makbuzObjesi.FirmaBireyAdi = makbuz.CARIFIRMABIREYADI;
makbuzObjesi.Adres = makbuz.CARIADRESI;
makbuzObjesi.MakbuzTarihi = makbuz.MAKBUZTARIHI;
makbuzObjesi.BelgeNo = makbuz.BELGENO;
//carinin para birimi TL ise kur ile çarpmaya gerek yok
if (makbuz.CARININPARABIRIMI == "TL")
{
makbuzObjesi.GenelToplam = makbuz.GENELTOPLAM.Value;
}
else
{
makbuzObjesi.GenelToplam = (makbuz.GENELTOPLAM * isleminKuru).Value;
}
makbuzObjesi.ParaBirimi = "TL";
makbuzObjesi.Yaziyla =
BAL.para.DataFormat.tutar_to_yazi(DAL.Format.ParaDuzenle.ParaFormatDuzenle(makbuzObjesi.GenelToplam.ToString().Replace(',','.')));
makbuzObjesi.Aciklama = makbuz.ACIKLAMA;
makbuzListesi.Add(makbuzObjesi);
makbuzObjesi.PersonelAdi = makbuz.PERSONELADI;

}
return makbuzListesi;
}

2
ответ дан 7 июля 2011 в 07:07 Источник Поделиться

Здесь вы идете с вашего деления 1 большой метод на 3 части, как вы хотели :

public static IEnumerable MakbuzOlustur(int islemId)        
{
var makbuzQuery = CreateMakbuzQuery(islemId); // You got your makbuzQuery created and stored
List<Makbuz> makbuzListesi = CreateList(makbuzQuery);
var toReport = CreateReport(makbuzListesi);
}

// Part 1
private static CreateMakbuzQuery(int islemId) {
var makbuzQuery = from islem in db.TBLP1ISLEMs where islem.ID == islemId
select new {
islem.ID, CARIFIRMABIREYADI = islem.TBLP1CARI.K_FIRMAADI == null
|| islem.TBLP1CARI.K_FIRMAADI == "" ?
islem.TBLP1CARI.B_ADSOYAD : islem.TBLP1CARI.K_FIRMAADI,//SAYIN
CARIADRESI = CariAdresAyarla(islem.TBLP1CARI.ID), MAKBUZTARIHI =
DateTime.Now.ToShortDateString(), islem.BELGENO, islem.GENELTOPLAM, CARININPARABIRIMI
= islem.TBLP1CARI.LISTEPARABIRIMI, islem.PARABIRIMI, YAZIYLA =
BAL.para.DataFormat.tutar_to_yazi(DAL.Format.ParaDuzenle.ParaFormatDuzenle
(islem.GENELTOPLAM.ToString())), islem.ACIKLAMA, PERSONELADI = BirIsleminPersoneliniBul
(islem.ID)
};

return makbuzQuery;
}

// Part 2
private static CreateList(var makbuzQuery) {
List<Makbuz> makbuzListesi = new List<Makbuz>();
foreach (var makbuz in makbuzQuery) {
Makbuz makbuzObjesi = new Makbuz();
//e?er i?lemin kuru varsa çekiyorum
decimal isleminKuru = DovizTuruVerilenBirIsleminDovizKurunuCek(makbuz.ID,
makbuz.PARABIRIMI);
makbuzObjesi.IslemId = makbuz.ID;
makbuzObjesi.FirmaBireyAdi = makbuz.CARIFIRMABIREYADI;
makbuzObjesi.Adres = makbuz.CARIADRESI;
makbuzObjesi.MakbuzTarihi = makbuz.MAKBUZTARIHI;
makbuzObjesi.BelgeNo = makbuz.BELGENO;
//carinin para birimi TL ise kur ile çarpmaya gerek yok
if (makbuz.CARININPARABIRIMI == "TL") {
makbuzObjesi.GenelToplam = makbuz.GENELTOPLAM.Value;
} else {
makbuzObjesi.GenelToplam = (makbuz.GENELTOPLAM * isleminKuru).Value;
}
makbuzObjesi.ParaBirimi = "TL";
makbuzObjesi.Yaziyla = BAL.para.DataFormat.tutar_to_yazi(DAL.Format.ParaDuzenle.ParaFormatDuzenle(makbuzObjesi.GenelToplam.ToString().Replace(',','.')));
makbuzObjesi.Aciklama = makbuz.ACIKLAMA;
makbuzListesi.Add(makbuzObjesi);
makbuzObjesi.PersonelAdi = makbuz.PERSONELADI;
}
return makbuzListesi;
}

// PArt 3
private static CreateReport(List<Makbuz> makbuzListesi) {
var toReport = from makbuzSon in makbuzListesi
select new
{
ID = makbuzSon.IslemId,
FIRMABIREYADI = makbuzSon.FirmaBireyAdi
ADRES = makbuzSon.Adres,
MAKBUZTARIHI = makbuzSon.MakbuzTarihi,
BELGENO = makbuzSon.BelgeNo,
GENELTOPLAM = DAL.Format.ParaDuzenle.ParaFormatDuzenle
(makbuzSon.GenelToplam.ToString()) + " TL", PARABIRIMI
=makbuzSon.ParaBirimi, YAZIYLA = makbuzSon.Yaziyla, ACIKLAMA =
makbuzSon.Aciklama, PERSONELADI = makbuzSon.PersonelAdi
};

return toReport;
}

Надеюсь, это ваша работа. Пожалуйста, проверьте ваш запрос, чтобы убедиться, что пока ничего не форматирование теряется.

1
ответ дан 7 июля 2011 в 09:07 Источник Поделиться

Почему бы не использовать класс Makbuz как

select new Makbuz() 
{
//Assign all your properties here
}

вместо этого анонимного типа?

И вы могли бы сделать все эти запросы в один, если вы действительно хотите.

1
ответ дан 22 июля 2011 в 07:07 Источник Поделиться

Не прямой ответ, но проверить для ReSharper рефакторинг вещи. Довольно опрятно. Выделить какой-то фрагмент кода и выберите меню для ReSharper / рефакторинг / перемещения.. (сочетание клавиш Ctrl+РО) он будет копировать код в метод свой выбор и провода в правильные параметры, чтобы держать это работает.

Я нахожу, что когда я ecounter таких ситуациях, что они меньше головной боли теперь, как результат этого выбора. Как вы можете просто попробовать вещи, чтобы увидеть, как он выглядит и если вам не нравится, просто нажмите Ctrl+Z, чтобы отменить.

1
ответ дан 24 июля 2011 в 04:07 Источник Поделиться

Проще всего будет, используя Visual Studio, и пусть против колдовать. Выберите часть кода, щелкните правой кнопкой мыши и выбрать извлечь способ, это даст вам диалоговое окно, где можно дать соответствующее имя метода. Передачи параметров и возвращаемого значения все будут заботиться только в Visual студии. Нет, нужно сделать это вручную.

Но да, если у вас есть время, то идите через сайт http://www.dofactory.com и проверить, какой шаблон дизайна подходит для вашего кода. Перестроить соответствующим образом свой код.

Я всегда хожу с какой-то быстрый способ, когда я чувствую, что я должен скопировать и вставить логика будет извлекать способ от этого, и если мне надо в другой класс, я делаю, что метод, это работает в небольших проектах и, конечно, если вы работаете вне времени. В противном случае я лично предпочитаю структурного кодирования для расширения применимости.

Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь или информацию.

1
ответ дан 25 июля 2011 в 12:07 Источник Поделиться