Злоупотребляю ли я концепцией установщика свойств, когда тип данных свойства не соответствует типу данных соответствующего поля? - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть класс, представляющий документ rtf ClsRtfDoc.

Создание экземпляра объекта ClsRtfDoc читает файл rtf и сначала анализирует файл rtf для получения различных метаданных файла rtf.

Например, у меня есть поле int paperHeight, которое я использую для хранения высоты бумаги файла rtf, проанализированной по строке, содержащей содержимое файла rtf.

Поскольку содержимое файла rtf находится в строковой переменной, тип данных свойства PaperHeight является строкой, а свойство PaperHeight setter анализирует высоту бумаги из строкового объекта (например, ищите \paperw12240\paperh15840 и получает 15840 из большого двоичного объекта), преобразует его в целое число и устанавливает в поле paperHeight целочисленное значение.См. Код ниже.

Я сконструировал код таким образом, потому что хочу изолировать операцию parse + set.Злоупотребляю ли я концепцией установщика свойств, когда тип данных свойства не соответствует типу данных соответствующего поля?Есть ли лучшая практика (шаблон проектирования?), Которую я должен использовать при создании этого кода?

CODE

public partial class ClsRtfDoc
{
    int paperHeight;

    public string PaperHeight
    {
        set
        {
            MatchCollection objPaperHeight = Regex.Matches(value, "(\\\\paperw\\d+)(\\\\paperh\\d*)");

            if (objPaperHeight.Count >= 1 && objPaperHeight[0].Groups.Count == 3)
            {
                if (!(Int32.TryParse((objPaperHeight[0].Groups[2].Value).Replace("\\paperh", ""), out int paperHeightValue)))
                {
                    throw new FormatException("Can't find paper height");
                }
                else
                {
                    paperHeight = paperHeightValue;
                }
            }
            else
            {
                throw new FormatException("Can't find paper height");
            }
        }
    }

    // CTOR
    public ClsRtfDoc(string fqFRtfFileName)
    {
        string rtfTextFromFile = GetRtfFromFile(fqFRtfFileName);
        PaperHeight = rtfTextFromFile;
    }
}

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

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

0 голосов
/ 16 февраля 2019

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

public class ClsRtfDoc
    {
        public int PaperHeight {get;set;}
        public ClsRtfDoc(int paperHeight)
        {
            this.PaperHeight = paperHeight;
        }
        public void AddPaper(){
            //Do something
        }
        public void RemovePaperAt(int index){

        }
    }

Примером «методов», которые вы можете ожидать увидеть на ClsRtfDoc объекте, является AddPaper или RemovePaperAt.Но служба синтаксического анализа, с другой стороны, может выглядеть примерно так:

public interface IClsRtfDocParser
{
    ClsRtfDoc ParseFromFile(string filePath);
}
public class ClsRtfDocParser:IClsRtfDocParser
{
    public ClsRtfDoc ParseFromFile(string filePath)
    {
        int paperHeight = 0;
        //After reading the metadata, you reach the paper height line or something like that
        MatchCollection objPaperHeight = Regex.Matches(value, "(\\\\paperw\\d+)(\\\\paperh\\d*)");
        if (objPaperHeight.Count >= 1 && objPaperHeight[0].Groups.Count == 3){
            if (!(Int32.TryParse((objPaperHeight[0].Groups[2].Value).Replace("\\paperh", ""), out int paperHeightValue)))
            {
                throw new FormatException("Invalid file format");
            }
            else
            {
                paperHeight = paperHeightValue;
            }
        }
        return new ClsRtfDoc(paperHeight);
    }
}
...