Должен ли я использовать новые классы или создавать частичные?

1

Ситуация: у меня есть класс, который генерирует XML, а содержимое XML очень велико. Прямо сейчас у меня есть функция для каждого узла, но я замечаю, что класс становится очень большим. Я хочу предотвратить это, поэтому я думал о создании нового класса для каждого узла. У моей коллегии были разные мысли, и он предложил создать частичные классы.

Что бы вы предложили и почему?

Соответствующий код:

public class IbTaxReturnTagCreator : TagCreatorBase
{
    private readonly IMathLibQueryClient mathLibQueryClient;
    private readonly IUserIdentity userIdentity;

    public IbTaxReturnTagCreator(ILynxDataUnitOfWork unitOfWork,
        IMathLibQueryClient mathLibQueryClient,
        IUserIdentity userIdentity)
        : base(unitOfWork)
    {
        this.mathLibQueryClient = mathLibQueryClient;
        this.userIdentity = userIdentity;
    }

    protected override void WriteTag(Domain.TaxReturn taxReturn)
    {
        WriteStartingIbTag(taxReturn);

        WriteEmployeeTag(taxReturn);

        WriteRelationTag(taxReturn);

        WriteFeatures(taxReturn);

        WriteClosingIbTag();
    }

    private void WriteStartingIbTag(Domain.TaxReturn taxReturn)
    {
        XmlWriter.WriteStartElement("ib");
        WriteIbAttributes(taxReturn);
    }

    private void WriteIbAttributes(Domain.TaxReturn taxReturn)
    {
        // Write attributes in ib tag
        XmlWriter.WriteAttributeString("txrid", taxReturn.Id.ToString());
        XmlWriter.WriteAttributeString("guid", taxReturn.Guid.ToString());
        XmlWriter.WriteAttributeString("sofinr", taxReturn.FiscalNumber);
        XmlWriter.WriteAttributeString("belastingjaar", taxReturn.TaxYear.ToString());
        XmlWriter.WriteAttributeString("valuta", taxReturn.Currency);
        XmlWriter.WriteAttributeString("lastformview", taxReturn.LastFormOpen);
        if (taxReturn.InspectionOffice == null)
        {
            XmlWriter.WriteAttributeString("inspectie", string.Empty);
        }
        else
        {
            XmlWriter.WriteAttributeString("inspectie", taxReturn.InspectionOffice.Code);
        }
        XmlWriter.WriteAttributeString("beconnr", taxReturn.BeconNumber);
        if (taxReturn.TaxReturnPartner == null)
        {
            XmlWriter.WriteAttributeString("partnerguid", string.Empty);
        }
        else
        {
            XmlWriter.WriteAttributeString("partnerguid", taxReturn.TaxReturnPartner.Guid.ToString());
        }
        XmlWriter.WriteAttributeString("partnersofinr", "3.0");
        XmlWriter.WriteAttributeString("biljetsoort", "3.0");
    }

    private void WriteEmployeeTag(Domain.TaxReturn taxReturn)
    {
        XmlWriter.WriteStartElement("medewerker");
        XmlWriter.WriteAttributeString("code", taxReturn.Employee.Name);
        XmlWriter.WriteAttributeString("indienst", ToUSDateFormat(taxReturn.Employee.EmployedDateTime));
        XmlWriter.WriteAttributeString("uitdienst", ToUSDateFormat(taxReturn.Employee.DischargeDateTime));

        XmlWriter.WriteStartElement("relatie");
        XmlWriter.WriteAttributeString("sofinr", taxReturn.Employee.Customer.FiscalNumber);
        XmlWriter.WriteAttributeString("zoeknaam", taxReturn.Employee.Customer.SearchName);
        XmlWriter.WriteAttributeString("type", taxReturn.Employee.Customer.CustomerType);
        XmlWriter.WriteAttributeString("voorletters", taxReturn.Employee.Customer.Initials);
        XmlWriter.WriteAttributeString("tussenvoegsels", taxReturn.Employee.Customer.PrefixLastName);
        XmlWriter.WriteAttributeString("achternaam", taxReturn.Employee.Customer.LastName);
        XmlWriter.WriteAttributeString("geslacht", taxReturn.Employee.Customer.Gender.Id.ToString());
        XmlWriter.WriteAttributeString("gebdatum", ToUSDateFormat(taxReturn.Employee.Customer.BirthDateTime));
        XmlWriter.WriteAttributeString("ovldatum", ToUSDateFormat(taxReturn.Employee.Customer.DeceasedDateTime));

        XmlWriter.WriteStartElement("postadres");
        XmlWriter.WriteAttributeString("straat", taxReturn.Employee.Customer.PaStreet);
        XmlWriter.WriteAttributeString("straat2", taxReturn.Employee.Customer.PaStreet2);
        XmlWriter.WriteAttributeString("huisnr", taxReturn.Employee.Customer.PaHouseNumber);
        XmlWriter.WriteAttributeString("huisnrtoe", taxReturn.Employee.Customer.PaHouseNumberPostfix);
        XmlWriter.WriteAttributeString("postcode", taxReturn.Employee.Customer.PaZipCode);
        XmlWriter.WriteAttributeString("plaats", GetCity(taxReturn.Employee.Customer.PaCity));
        XmlWriter.WriteAttributeString("landcode", GetCountry(taxReturn.Employee.Customer.PaCountry));
        XmlWriter.WriteEndElement();

        XmlWriter.WriteStartElement("woonadres");
        XmlWriter.WriteAttributeString("WAstraat", taxReturn.Employee.Customer.HaStreet);
        XmlWriter.WriteAttributeString("WAstraat2", taxReturn.Employee.Customer.HaStreet2);
        XmlWriter.WriteAttributeString("WAhuisnr", taxReturn.Employee.Customer.HaHouseNumber);
        XmlWriter.WriteAttributeString("WAhuisnrtoe", taxReturn.Employee.Customer.HaHouseNumberPostfix);
        XmlWriter.WriteAttributeString("WApostcode", taxReturn.Employee.Customer.HaZipCode);
        XmlWriter.WriteAttributeString("plaats", GetCity(taxReturn.Employee.Customer.HaCity));
        XmlWriter.WriteAttributeString("landcode", GetCountry(taxReturn.Employee.Customer.HaCountry));
        XmlWriter.WriteEndElement();

        XmlWriter.WriteEndElement(); // End relation tag
        XmlWriter.WriteEndElement(); // End employee tag
    }

    private void WriteRelationTag(Domain.TaxReturn taxReturn)
    {
        XmlWriter.WriteStartElement("relatie");

        XmlWriter.WriteAttributeString("sofinr", taxReturn.Customer.FiscalNumber);
        XmlWriter.WriteAttributeString("zoeknaam", taxReturn.Customer.SearchName);
        XmlWriter.WriteAttributeString("type", taxReturn.Customer.CustomerType);
        XmlWriter.WriteAttributeString("voorletters", taxReturn.Customer.Initials);
        XmlWriter.WriteAttributeString("tussenvoegsels", taxReturn.Customer.PrefixLastName);
        XmlWriter.WriteAttributeString("achternaam", taxReturn.Customer.LastName);
        XmlWriter.WriteAttributeString("geslacht", taxReturn.Customer.Gender.Id.ToString());
        XmlWriter.WriteAttributeString("gebdatum", ToUSDateFormat(taxReturn.Customer.BirthDateTime));
        XmlWriter.WriteAttributeString("ovldatum", ToUSDateFormat(taxReturn.Customer.DeceasedDateTime));

        XmlWriter.WriteStartElement("postadres");
        XmlWriter.WriteAttributeString("straat", taxReturn.Customer.PaStreet);
        XmlWriter.WriteAttributeString("straat2", taxReturn.Customer.PaStreet2);
        XmlWriter.WriteAttributeString("huisnr", taxReturn.Customer.PaHouseNumber);
        XmlWriter.WriteAttributeString("huisnrtoe", taxReturn.Customer.PaHouseNumberPostfix);
        XmlWriter.WriteAttributeString("postcode", taxReturn.Customer.PaZipCode);
        XmlWriter.WriteAttributeString("plaats", GetCity(taxReturn.Customer.PaCity));
        XmlWriter.WriteAttributeString("landcode", GetCountry(taxReturn.Customer.PaCountry));
        XmlWriter.WriteEndElement();

        XmlWriter.WriteStartElement("woonadres");
        XmlWriter.WriteAttributeString("WAstraat", taxReturn.Customer.HaStreet);
        XmlWriter.WriteAttributeString("WAstraat2", taxReturn.Customer.HaStreet2);
        XmlWriter.WriteAttributeString("WAhuisnr", taxReturn.Customer.HaHouseNumber);
        XmlWriter.WriteAttributeString("WAhuisnrtoe", taxReturn.Customer.HaHouseNumberPostfix);
        XmlWriter.WriteAttributeString("WApostcode", taxReturn.Customer.HaZipCode);
        XmlWriter.WriteAttributeString("plaats", GetCity(taxReturn.Customer.HaCity));
        XmlWriter.WriteAttributeString("landcode", GetCountry(taxReturn.Customer.HaCountry));
        XmlWriter.WriteEndElement();

        XmlWriter.WriteEndElement(); // End relation tag
    }

    private void WriteFeatures(Domain.TaxReturn taxReturn)
    {
        XmlWriter.WriteStartElement("features");

        var featureValues = GetFeatureValues(taxReturn);
        foreach (var feature in featureValues)
        {
            XmlWriter.WriteStartElement("feature");

            XmlWriter.WriteAttributeString("id", feature.Name);
            XmlWriter.WriteCData(feature.Value);

            XmlWriter.WriteEndElement(); // Closing tag feature
        }

        var featureTables = GetFeatureTableValues(taxReturn).GroupBy(f => f.FeatureName);
        foreach (var feature in featureTables)
        {
            XmlWriter.WriteStartElement("table");
            XmlWriter.WriteAttributeString("id", feature.Key);

            var rows = feature.OrderBy(f => f.RowId).Select(f => f.RowId).Distinct();
            foreach (var row in rows)
            {
                XmlWriter.WriteStartElement("row");

                foreach (var subfeature in feature.Where(f => f.RowId == row))
                {
                    XmlWriter.WriteStartElement("subfeature");
                    XmlWriter.WriteAttributeString("id", subfeature.Name);
                    XmlWriter.WriteCData(subfeature.Value);
                    XmlWriter.WriteEndElement();
                }

                XmlWriter.WriteEndElement(); // Closing row tag
            }

            XmlWriter.WriteEndElement(); // Closing table feature
        }

        var featuresIafWoInvestment = GetIafSubFeaturesWithoutInvestment(taxReturn).GroupBy(f => f.FeatureName);
        foreach (var feature in featuresIafWoInvestment)
        {
            XmlWriter.WriteStartElement("table");
            XmlWriter.WriteAttributeString("id", feature.Key);

            var rows = feature.OrderBy(f => f.Row).Select(f => f.Row).Distinct();
            foreach (var row in rows)
            {
                XmlWriter.WriteStartElement("row");

                foreach (var subfeature in feature.Where(f => f.Row == row))
                {
                    XmlWriter.WriteStartElement("subfeature");
                    XmlWriter.WriteAttributeString("id", subfeature.SubFeatureName);
                    XmlWriter.WriteCData(subfeature.SubFeatureValue);
                    XmlWriter.WriteEndElement();
                }

                XmlWriter.WriteEndElement(); // Closing row tag
            }

            XmlWriter.WriteEndElement(); // Closing table feature
        }

        var featuresIafWithInvestments = GetIafSubFeaturesWithInvestment(taxReturn).GroupBy(f => f.FeatureName);
        foreach (var feature in featuresIafWithInvestments)
        {
            XmlWriter.WriteStartElement("table");
            XmlWriter.WriteAttributeString("id", feature.Key);
            XmlWriter.WriteAttributeString("iafguid", feature.First().InvestmentGuid.Value.ToString());
            XmlWriter.WriteAttributeString("iafzoeknaam", feature.First().InvestmentName);

            var rows = feature.OrderBy(f => f.Row).Select(f => f.Row).Distinct();
            foreach (var row in rows)
            {
                XmlWriter.WriteStartElement("row");

                foreach (var subfeature in feature.Where(f => f.Row == row))
                {
                    XmlWriter.WriteStartElement("subfeature");
                    XmlWriter.WriteAttributeString("id", subfeature.SubFeatureName);
                    XmlWriter.WriteCData(subfeature.SubFeatureValue);
                    XmlWriter.WriteEndElement();
                }

                XmlWriter.WriteEndElement(); // Closing row tag
            }

            XmlWriter.WriteEndElement(); // Closing table features
        }

        XmlWriter.WriteEndElement(); // Closing features features
    }

    private void WriteClosingIbTag()
    {
        XmlWriter.WriteEndElement();
    }

    private string GetCountry(Domain.Country country)
    {
        var countryString = string.Empty;

        if (country != null)
            countryString = country.Code;

        return countryString;
    }

    private string GetCity(Domain.City city)
    {
        var cityString = string.Empty;

        if (city != null)
            cityString = city.Name;

        return cityString;
    }

    private FeatureNameValueView[] GetFeatureValues(Domain.TaxReturn taxReturn)
    {
        var featureValues = this.mathLibQueryClient.GetAllFeatureValues(this.userIdentity.UserId, taxReturn.Id);
        return featureValues;
    }

    private SubFeatureDetailView[] GetFeatureTableValues(Domain.TaxReturn taxReturn)
    {
        var featureNames = this.mathLibQueryClient.GetAllSubFeatureValues(this.userIdentity.UserId, taxReturn.Id);
        return featureNames;
    }

    private SubFeatureInvestmentDetailView[] GetIafSubFeaturesWithoutInvestment(Domain.TaxReturn taxReturn)
    {
        var featureNames = this.mathLibQueryClient.GetInvestmentSubFeatures(this.userIdentity.UserId, taxReturn.Id, false);
        return featureNames;
    }

    private SubFeatureInvestmentDetailView[] GetIafSubFeaturesWithInvestment(Domain.TaxReturn taxReturn)
    {
        var featureNames = this.mathLibQueryClient.GetInvestmentSubFeatures(this.userIdentity.UserId, taxReturn.Id, true);
        return featureNames;
    }
}
Теги:
oop
design

2 ответа

2

Фактически каждый узел в вашем документе является объектом, который имеет атрибуты. Таким образом, вы можете реализовать класс для каждого вложенного типа объекта. Таким образом, вы также можете использовать простые методы XML-сериализации, а не писать все вещи.

  • 0
    Я сознательно решил использовать XmlSerialization, потому что это самый быстрый способ создания XML-файлов. Не исключение, что XML> 1 МБ.
  • 0
    +1 Для изучения XML-сериализации, а не делать все вручную. Взгляните на msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx и Пример заказа на поставку.
Показать ещё 2 комментария
0

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

Если вы хотите думать об этом объектно-ориентированным образом, любой класс должен иметь возможность сериализовать себя и должен иметь интерфейс, объявляющий об этом. Вы также можете продлить это позже, если у вас есть другие способы их представления. Вместо того, чтобы каждый раз менять один основной класс при изменении представления любого из узлов, вы можете изменить этот класс узлов (Employee, Relation и т.д.). Это поможет вашему контролю версий и управлению версиями.

  • 0
    Спасибо, но это только начало урока. Размер этого класса будет как минимум втрое. Но я думаю, что согласен с частичной частью.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню