1

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

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

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

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

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

我正在跟踪申请人的姓名,地址,电话,传真号码,手机,替代电话,替代地址,配偶相同,然后是孩子,参考资料,公司信息......等等

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

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

这符合我应该做的吗?

再次感谢

4

6 回答 6

5

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

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

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

于 2013-02-13T12:37:44.903 回答
0

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

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

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

希望能帮助到你

于 2013-02-13T12:45:19.913 回答
0

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

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
于 2013-02-13T12:47:04.343 回答
0

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

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

public int IntCard { get; set; }
于 2013-02-13T12:51:32.167 回答
0

蒂姆,

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

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. 属性不再需要显式私有变量

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

于 2013-02-13T15:51:00.180 回答
0

通过阅读评论,您看起来至少需要两个类 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/

于 2013-02-13T15:56:28.833 回答