【问题标题】:Using get/set asp.net c# theres too many properties使用 get/set asp.net c# theres too many properties
【发布时间】:2013-02-13 12:33:56
【问题描述】:

我习惯于创建一个属性类,我将在其中包含所有字段,并且必须编写所有 get/set 属性,然后有另一个数据库类,我将在其中进行所有数据库调用。

Properties Class
    private int _intCard
    public int IntCard
    {
        set { _intcard = value;}
    }
Constructor here

现在感觉这不是正确的方法,因为我要处理 120 多个属性,并且必须将这些属性中的每一个都写出来似乎非常耗时。我需要为某些属性添加验证是我选择这种方式的原因,我可以在 set 方法中验证它。谁能提出一种我可以研究的替代方法来完成相同的结果。

********************---------------*******************

因此,我理解我的设计存在缺陷,这就是我想到这个问题的原因。我对如何解决此问题有一个想法,但不知道这是否是解决此问题的正确方法。我搜索了对象设计原则并阅读了它,但需要更多时间来掌握它教给我的东西。现在我想知道这种方法是否正确

我正在跟踪申请人的姓名、地址、电话、传真号码、手机、替代电话、替代地址,配偶相同,然后是子女、推荐信、公司信息……等等

我不会撒谎,我还不了解抽象类,如果这是我应该采取的方法,我将花更多时间来学习它,但现在希望这会是合适的。

属性类如下 申请者.cs、申请者配偶.cs、申请者联系信息.cs、appreferences.cs......

这符合我应该做的吗?

再次感谢

【问题讨论】:

  • 为什么不使用自动属性来代替..?如果您没有对属性做任何独特的事情
  • @DJKRAZE 这是因为他想在 setter 中执行验证。但是,我建议可以使用带有数据注释的自动属性来执行验证(尽管我也同意 Brian 的观点,120 个属性在一个类中似乎很多!)
  • @DJKRAZE Class.IntCard.set' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.
  • 如果你不想验证,那么你可以简单地写 public int intcard{get;set;}
  • @krshekhar 是的,但是由于他明确表示他想在 set 方法中验证它,所以这不是很有帮助!

标签: c# asp.net get set


【解决方案1】:

我不禁认为您的对象建模不合适。如果您有一个具有 120 个属性的类,那么您还没有将该对象划分为单独的角色/职责等。我会考虑(大幅)增加您正在创建的类的数量,这样您的解决方案就会变得更易于管理。

这不会减少您必须处理的属性数量。可能值得考虑不可变对象(您是否需要在构建期间设置这些属性?),和/或使用Builder 模式来帮助构建。

最后,你需要公开这些属性吗? OO 的一个关键部分是告诉对象为你做事,而不是获取它们的内容并为它们做事。如果您可以告诉一个对象为您做某事,那么您很可能不需要公开它们的(内部)字段。

【讨论】:

  • +1 If you have a class with 120 properties then you've not divided up that object into separate roles/responsibilities etc. 我完全同意你的看法
  • 感谢您的回复,这将是一个记录个人个人信息的应用程序。例如姓名、地址、电话、备用电话、公司名称、配偶姓名、地址、电话……等等,似乎所有这些字段都属于一类。你能提出一个小例子来说明你的意思吗?
  • 你是说即使它的一个应用程序只有一个提交按钮,我也会创建多个属性类,例如 primaryapplicant.cs、saveapplicant.cs、businessinfo.cs、references.cs...
【解决方案2】:

通过阅读 cmets,您看起来至少需要两个类 Person,Address 类似:

public class Person 
{
  Guid Id {get; set;}
  string Name {get; set;}
  // ad infinitum the truely unique things that relate to an Individual

  Address BusinessAddress {get; set;}
  Address HomeAddress {get; set;}
  Person Spouse {get; set;}
}

public class Address
{
  Guid Id {get; set;}
  Line1 {get; set;}
  // ad infinitum all the truly unique things that relate to an address
}

以上内容本质上是伪代码,不应被解读为“这正是如何做到的”,例如,我没有说明属性是私有/公共/受保护的还是确实提供了构造函数。

但它确实展示了如何使用其他类作为属性,并且在“配偶”的情况下创建非常丰富和深入的对象层次结构(配偶可能包含地址和可能包含另一个配偶 - 循环引用啊!)可以填充和用于使代码更具可读性并将代码的职责分离出来,将“概念/实体/域”封装到一个单元中,该单元的工作就是“那个特定的东西”。可能值得在这里查看 OOP 概念,如封装、继承等(基本上是 OO 的四个原则),以了解对象应该代表什么,这个链接有一个简短的介绍,应该可以帮助您决定如何打破类并构造更多有用的对象。

http://codebetter.com/raymondlewallen/2005/07/19/4-major-principles-of-object-oriented-programming/

【讨论】:

    【解决方案3】:

    在现代 c# 版本中,有一个超级紧凑的属性语法:

    public class Properties {
        public int IntCard { get; set; }
    }
    

    这里 c# 为你处理私有变量,这样你可以避免很多击键。对于验证,您可以使用 数据注释。更多信息here

    希望对你有帮助

    【讨论】:

    • 感谢您将调查数据注释似乎我需要将我的属性与响应分开
    • 是的,当然,具有太多属性的单个对象几乎总是指出初始设计存在问题,但您应该从全局角度看待您的架构。祝你好运!! ;)
    【解决方案4】:

    完全同意@brian-agnew 的观点,如果您在 1 个类中有这么多属性,那么您可能需要进行一些重构,因为您几乎可以肯定没有足够的关注点分离。

    但是,即使经过一些重构,您仍将拥有这些属性,因此值得查看数据验证属性。例如,这里是使用 MVC 的步骤:http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validation-with-the-data-annotation-validators-cs。然后您可以使用auto-implemented 属性:

    public int IntCard { get; set; }
    

    【讨论】:

      【解决方案5】:

      请注意,这并不能解决您的设计问题。如果您的数据库在 sql-server 上,为避免键入,您可以使用这样的查询(请根据您的要求进行修改)来获取具有数据类型的属性列表,然后复制并粘贴结果。 SQL SERVER DEMO

      SELECT  'public ' + CASE DATA_TYPE WHEN 'smallint' THEN 'short' 
                      WHEN 'bit' THEN 'bool'
                      WHEN 'smalldatetime' THEN 'System.DateTime'
                      WHEN 'datetime' THEN 'System.DateTime'
                      WHEN 'date' THEN 'System.DateTime'
                      WHEN 'uniqueidentifier' THEN 'System.Guid'
                      WHEN 'varchar' THEN 'string'
                      WHEN 'int' THEN 'int' 
                      WHEN 'numeric' THEN 'decimal'
                      ELSE DATA_TYPE END 
                + CASE IS_NULLABLE  WHEN 'NO' THEN '' ELSE '?' END
                + ' ' + COLUMN_NAME 
                + ' { get; set; }' AS def
      FROM INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = 'YourTableName'
      ORDER BY IS_NULLABLE, ORDINAL_POSITION
      

      【讨论】:

        【解决方案6】:

        蒂姆,

        根据您的编辑,您看起来是正确的。您应该将属性分解为特定项目,例如:

        public class Person
            {
                public string GivenName { get; set; }
                public string Surname { get; set; }
                public ContactInfo ContactInformation { get; set; }
            }
        
        public class Applicant : Person
            {
                public Person Spouse { get; set; }
                public List<Person> Children { get; set; }
                public List<Reference> References { get; set; }
            }
        
        public class ContactInfo
            {
                [Required]
                [DataType(DataType.PhoneNumber)]
                public string PhoneNumber { get; set; }
        
                [DataType(DataType.EmailAddress)]
                public string EmailAddress { get; set; }
        
                public Address PrimaryAddress { get; set; }
                public Address AlternativeAddress { get; set; }
            }
        

        所以这里的重点是

        1. 类被分解成可管理、可重用的块
        2. 数据注释(ContactInfo 类中的必需和数据类型)用于验证属性
        3. 属性不再需要显式私有变量

        附:有关数据注释的更多信息:http://msdn.microsoft.com/en-us/library/dd901590(v=vs.95).aspx

        【讨论】:

          猜你喜欢
          • 2021-11-16
          • 1970-01-01
          • 1970-01-01
          • 2014-10-14
          • 1970-01-01
          • 1970-01-01
          • 2020-12-03
          • 2021-12-31
          • 2016-10-20
          相关资源
          最近更新 更多