首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于简单的操作使用C#属性,我应该在哪里画线呢?

对于简单的操作使用C#属性,我应该在哪里画线呢?
EN

Code Review用户
提问于 2014-07-31 15:51:36
回答 3查看 1.1K关注 0票数 19

我是否应该将Linq语句放入对象属性中?这是一种最佳做法还是一种否定?另外,如果可以的话,我应该在哪里用这个划线呢?我认为数据库访问可能太远了,但是是有一行,还是只有一个灰色区域?你看到我使用Linq有什么问题吗?

代码语言:javascript
复制
[XmlRoot("message")]
public class Message
{
    [XmlAttribute]
    public string type { get; set; }
    [XmlElement("segment")]
    public Segment[] segments { get;set; }
    [XmlElement("group")]
    public Group[] groups { get; set; }
    [XmlElement("field")]
    public Field[] Issues { get; set; }`public Field[] Issues { get; set; }

    public bool HasNoIssues
    {
        get
        {
            return Issues == null || Issues.Length == 0;
        }
    }

    public bool HasWarnings
    {
        get
        {
            if (!HasNoIssues)
                return Issues.Where(x => x.name == "Warnings").Count() > 0;
            return false;
        }
    }

    public bool HasErrors
    {
        get
        {
            if (!HasNoIssues)
                return Issues.Where(x => x.name == "Errors").Count() > 0;
            return false;
        }
    }

    public ResponseTags[] Warnings
    {
        get
        {
            if (HasWarnings)
                return Issues.Where(x => x.name == "Warnings").First().groups.First().warnings;
            return new ResponseTags[0];
        }
    }

    public ResponseTags[] Errors
    {
        get
        {
            if (HasErrors)
                return Issues.Where(x => x.name == "Errors").First().groups.First().warnings;
            return new ResponseTags[0];
        }
    }

    public string DisplayWarnings
    {
        get
        {
            var warningString = "";
            if (HasWarnings)
            {
                warningString += Issues.Where(x => x.name == "Warnings").First().groups.First().warnings.Aggregate("", (data, t) => data + t.value +"\n");                   
            }
            return warningString;

        }
    }

    public string DisplayErrors
    {
        get
        {
            var errorString = "";
            if (HasErrors)
            {
                errorString += Issues.Where(x => x.name == "Errors").First().groups.First().errors.Aggregate("", (data, t) => data + t.value+"\n");
            }
            return errorString;

        }
    }}

[Serializable]
public class Segment
{
    [XmlAttribute]
    public string type { get; set; }
    [XmlElement("field")]
    public Field[] fields { get; set; }
}

[Serializable]
public class Group
{
    [XmlAttribute]
    public string type { get; set; }
    [XmlElement("segment")]
    public Segment[] segments { get; set; }
    [XmlElement("e")]
    public ResponseTags[] errors { get; set; }
    [XmlElement("w")]
    public ResponseTags[] warnings { get; set; }
    [XmlElement("i")]
    public ResponseTags[] informations { get; set; }
}


[Serializable]
public class Field
{
    [XmlAttribute]
    public string name { get; set; }
    [XmlText]
    public string value { get; set; }
    [XmlElement("datatype")]
    public DataType datatype { get; set; }
    [XmlElement("group")]
    public Group[] groups { get; set; }
}


[Serializable]
public class DataType
{
    [XmlAttribute]
    public string type { get; set; }
    [XmlElement("field")]
    public Field[] fields { get; set; }
}

[Serializable]
public class ResponseTags
{
    [XmlAttribute]
    public string value { get; set; }
    [XmlAttribute]
    public string path { get; set; }
    [XmlAttribute]
    public string type { get; set; }
    [XmlAttribute]
    public string HL7ErrorCode { get; set; }
    [XmlAttribute]
    public string HL7ErrorCodeFullDescription { get; set; }
    [XmlAttribute]
    public string SegmentID { get; set; }
    [XmlAttribute]
    public string FieldPosition { get;set;}
    [XmlAttribute]
    public string FieldRepetition { get; set; }
    [XmlAttribute]
    public string ComponentNumber { get; set;}
    [XmlAttribute]
    public string SubComponentNumber { get; set;}
    [XmlAttribute]
    public string Severity { get; set; }
}

然后,该对象将被一些xml反序列化填充。

代码语言:javascript
复制
private Message getMessage(string xml)
    {
        if (xml.Length == 0)
            return new Message();
        XmlSerializer serial = new XmlSerializer(typeof(Message));
        MemoryStream soapwriter = new MemoryStream(Encoding.UTF8.GetBytes(xml));
        return (Message)serial.Deserialize(soapwriter);
    }

这里有一些测试xml,这里没有真正的数据,我已经把它刮掉了。

代码语言:javascript
复制
<message xmlns="" type="VxuV04">
    <segment type="msh">
        <field name="MSH-1 (FieldSeperator)">
            <![CDATA[ | ]]>
        </field>
        <field name="MSH-2 (EncodingCharacters)">
            <![CDATA[ ^~\& ]]>
        </field>
        <field name="MSH-3 (SendingApplication)">
            <datatype type="hd">
                <field name="NamespaceID">OMG IMMUNIZATIO</field>
                <field name="UniversalID"/>
                <field name="UniversalIDType"/>
            </datatype>
        </field>
        <field name="MSH-4 (SendingFacility)">
            <datatype type="hd">
                <field name="NamespaceID">FF0000</field>
                <field name="UniversalID"/>
                <field name="UniversalIDType"/>
            </datatype>
        </field>
        <field name="MSH-5 (ReceivingApplication)">
            <datatype type="hd">
                <field name="NamespaceID">AK TEST FACILITY</field>
                <field name="UniversalID"/>
                <field name="UniversalIDType"/>
            </datatype>
        </field>
        <field name="MSH-6 (ReceivingFacility)">
            <datatype type="hd">
                <field name="NamespaceID">ML1001</field>
                <field name="UniversalID"/>
                <field name="UniversalIDType"/>
                <group type="ProblemCollection">
                    <e value="Invalid value: ML1001. Reason: No user assigned to this facility." path="MSH/ReceivingFacility/NamespaceID" type="problem" HL7ErrorCode="103" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Msh" SegmentSequence="" FieldPosition="6" FieldRepetition="1" ComponentNumber="" SubComponentNumber="" Severity="E"/>
                </group>
            </datatype>
        </field>
        <field name="MSH-7 (DateTimeOfMessage)">3/28/2014</field>
        <field name="MSH-9 (MessageType)">
            <datatype type="msg">
                <field name="MessageCode">VXU</field>
                <field name="TriggerEvent">V04</field>
                <field name="MessageStructure">VXU_V04</field>
            </datatype>
        </field>
        <field name="MSH-10 (MessageControlID)">dsfg00541680</field>
        <field name="MSH-11 (ProcessingID)">
            <datatype type="processingtype">
                <field name="ProcessingID">P</field>
                <field name="ProcessingMode"/>
            </datatype>
        </field>
        <field name="MSH-12 (HL7Version)">2.5.1</field>
        <field name="MSH-15 (AcceptAcknowledgmentType)"/>
        <field name="MSH-16 (ApplicationAcknowledgmentType)"/>
        <field name="MSH-21 (MessageProfileIdentifier)">
            <datatype type="ei">
                <field name="EntityIdentifier"/>
                <field name="NamespaceID"/>
                <field name="UniversalID"/>
                <field name="UniversalIDType"/>
            </datatype>
        </field>
        <field name="MSH-22 (ResponsibleSendingOrganization)">
            <datatype type="xon">
                <field name="OrganizationName"/>
                <field name="OrganizationNameTypeCode"/>
                <field name="AssigningAuthority">
                    <datatype type="hd">
                        <field name="NamespaceID"/>
                        <field name="UniversalID"/>
                        <field name="UniversalIDType"/>
                    </datatype>
                </field>
                <field name="IdentifierTypeCode"/>
                <field name="AssigningFacility">
                    <datatype type="hd">
                        <field name="NamespaceID"/>
                        <field name="UniversalID"/>
                        <field name="UniversalIDType"/>
                    </datatype>
                </field>
                <field name="OrganizationIdentifier"/>
            </datatype>
        </field>
        <field name="MSH-23 (ResponsibleReceivingOrganization)">
            <datatype type="xon">
                <field name="OrganizationName"/>
                <field name="OrganizationNameTypeCode"/>
                <field name="AssigningAuthority">
                    <datatype type="hd">
                        <field name="NamespaceID"/>
                        <field name="UniversalID"/>
                        <field name="UniversalIDType"/>
                    </datatype>
                </field>
                <field name="IdentifierTypeCode"/>
                <field name="AssigningFacility">
                    <datatype type="hd">
                        <field name="NamespaceID"/>
                        <field name="UniversalID"/>
                        <field name="UniversalIDType"/>
                    </datatype>
                </field>
                <field name="OrganizationIdentifier"/>
            </datatype>
        </field>
        <field name="Errors">
            <group type="ProblemCollection">
                <e value="MSH-6 (ReceivingFacility) : Invalid value: zz1001. Reason: No user assigned to this facility." path="MSH/ReceivingFacility/NamespaceID" type="problem" HL7ErrorCode="z3" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Msh" SegmentSequence="" FieldPosition="6" FieldRepetition="1" ComponentNumber="" SubComponentNumber="" Severity="E"/>
            </group>
        </field>
    </segment>  
    <field name="Errors">
        <group type="ProblemCollection">
            <e value="MSH-6 (ReceivingFacility) : Invalid value: ML1001. Reason: No user assigned to this facility." path="MSH/ReceivingFacility/NamespaceID" type="problem" HL7ErrorCode="zzz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Msh" SegmentSequence="" FieldPosition="6" FieldRepetition="1" ComponentNumber="" SubComponentNumber="" Severity="E"/>
        </group>
    </field>
    <field name="Warnings">
        <group type="ProblemCollection">
            <w value="PID-11 (PatientAddress)-Mailing : County Code  is not in the list of known county codes ." path="PID/PatientAddress" type="problem" HL7ErrorCode="zzz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Pid" SegmentSequence="" FieldPosition="11" FieldRepetition="" ComponentNumber="" SubComponentNumber="" Severity="W"/>
            <w value="PID-11 (PatientAddress)-Physical : County Code  is not in the list of known county codes ." path="PID/PatientAddress" type="problem" HL7ErrorCode="zzz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Pid" SegmentSequence="" FieldPosition="11" FieldRepetition="" ComponentNumber="" SubComponentNumber="" Severity="W"/>
        </group>
    </field>
    <field name="ErrorsAndWarningsCombined">
        <group type="ProblemCollection">
            <e value="MSH-6 (ReceivingFacility) : Invalid value: ML1001. Reason: No user assigned to this facility." path="MSH/ReceivingFacility/NamespaceID" type="problem" HL7ErrorCode="zz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Msh" SegmentSequence="" FieldPosition="6" FieldRepetition="1" ComponentNumber="" SubComponentNumber="" Severity="E"/>
            <w value="PID-11 (PatientAddress)-Mailing : County Code is not in the list of known county codes" path="PID/PatientAddress" type="problem" HL7ErrorCode="zz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Pid" SegmentSequence="" FieldPosition="11" FieldRepetition="" ComponentNumber="" SubComponentNumber="" Severity="W"/>
            <w value="PID-11 (PatientAddress)-Physical : County Code is not in the list of known county codes ." path="PID/PatientAddress" type="problem" HL7ErrorCode="zzz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Pid" SegmentSequence="" FieldPosition="z" FieldRepetition="" ComponentNumber="" SubComponentNumber="" Severity="W"/>
        </group>
    </field>
</message>

我保证闭幕词标签在那里

EN

回答 3

Code Review用户

回答已采纳

发布于 2014-07-31 17:50:02

我认为大多数事情都是这样说的,我重复并添加了我自己的一些东西:

  • 正如杰西所说,我将使用Any而不是Where + Count。我想它应该有更好的表现。
  • 属性是给我的:HasNoIssuesHasWarningsHasErrors
  • 在我看来,剩下的应该是方法
  • Issues.Where(x => x.Name == "Warnings").First()Issues.First(x => x.Name == "Warnings")相同
  • 我更改了函数的名称(但这可能是品味的问题)。

所以在我的方法中是这样的:

代码语言:javascript
复制
    public Field[] Issues { get; set; }

    public bool HasErrors
    {
        get
        {
            if (HasIssues)
            {
                return Issues.Any(x => x.Name == "Errors");
            }
            return false;
        }
    }

    public bool HasIssues
    {
        get
        {
            return Issues != null && Issues.Length > 0;
        }
    }

    public bool HasWarnings
    {
        get
        {
            if (HasIssues)
            {
                return Issues.Any(x => x.Name == "Warnings");
            }
            return false;
        }
    }

    public ResponseTags[] GetErrors()
    {
        if (HasErrors)
        {
            return Issues.First(x => x.Name == "Errors").Groups.First().Warnings;
        }
        return new ResponseTags[0];
    }

    public ResponseTags[] GetWarnings()
    {
        if (HasWarnings)
        {
            return Issues.First(x => x.Name == "Warnings").Groups.First().Warnings;
        }
        return new ResponseTags[0];
    }

    // For the display functions:
    // I don't understand why you only usses the first
    // groups of errors and warnings, but that may be a requirement.

    public string GetErrorsDisplayData()
    {
        var errorString = "";
        if (HasErrors)
        {
            errorString += Issues.First(x => x.Name == "Errors")
                .Groups.First()
                .Errors.Aggregate("", (data, t) => data + t.Value + "\n");
        }
        return errorString;
    }

    public string GetWarningsDisplayData()
    {
        var warningString = "";
        if (HasWarnings)
        {
            warningString += Issues.First(x => x.Name == "Warnings")
                .Groups.First()
                .Warnings.Aggregate("", (data, t) => data + t.Value + "\n");
        }
        return warningString;
    }
票数 15
EN

Code Review用户

发布于 2014-07-31 17:01:31

方法SetGet属性通过它们的GetSet方法,因此对get和set方法中的属性执行操作并不是一个好主意。

您应该使用object方法来完成这个任务。

公共字符串DisplayErrors { get { var errorString = "";if (HasErrors) { errorString += Issues.Where(x => x.name == Issues.Where ( data,t) => data+t.value+“n”);}返回errorString;}

应该是这样

代码语言:javascript
复制
public string DisplayErrors (bool inputBoolean)
{
    var errorString = "";
    if (inputBoolean)
    {
         errorString += Issues.Where(x => x.name == "Errors").First().groups.First().errors.Aggregate("", (data, t) => data + t.value+"\n");
    }
    return errorString;
}

Console.WriteLine(DisplayErrors(HasErrors));

DisplayErrors对我来说是一个动作,所以它应该是对象执行的方法,而不是对象的属性,

  • 财产=描述
  • 方法=行动

查看HasWarnings属性中的内容。布尔属性应该是设置为true或false的对象标志,对象中的方法可以获取或设置标志(为true或false),也可以是与对象交互的对象可见的标志。

所有这些都让我思考整个代码,如果我创建一个新的对象,所有这些属性都指向其他属性,没有设置任何设置。

Warnings属性查看HasWarnings属性,该属性反过来查看HasNoIssues属性(实际上应该类似于HasIssues),在一个名为Issues的类中,它有问题。

这不是一个完整的工人阶级,如果你进一步发展它,你就会发现这根本不是一个好的设计。

HasWarnings应该是一个属性,但是它不应该寻找另一个属性来获得它的值。

需要有一个构造函数来设置基本属性,这就是您所说的

代码语言:javascript
复制
if (HasIssues) {
    HasWarnings = Issues.Where(x => x.name == "Warnings").Count() > 0;
} else {
    HasWarnings = false;
}
票数 15
EN

Code Review用户

发布于 2014-08-01 08:49:39

考虑到Issues是一个固定大小的数组,我个人会考虑缓存结果(除非IssuesIssues中的东西会比调用属性的变化更多)。

尽管如果您的类被反序列化填充,并且它不应该被更改(就像我假设它被命名为类名一样),我还是想通过将所有的setter设置为私有/受保护来使其公开不变。这将带来额外的好处,这意味着您可以在反序列化点评估属性,而不必从属性内部查询数组。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/58667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档