2009-10-18 2 views
1

я знаю, что это должно быть общим вопросом, но посмотрите:Проектирование классов в C#

Здесь у меня есть тестовый класс:

public class EmployeeClass 
{ 
private int _id; 
private string _name; 
private double _salary; 

public int id 
{ 
get{...} 
set{...} 
} 

public string name 
{ 
get{...} 
set{...} 
} 
//and so on 
} 

Возникает вопрос: для меня, оно не имеет смысла чтобы иметь общедоступные свойства, соответствующие всем частным полям.

Каков подход для ограничения доступа к itens класса?

В момент инициализации сделать я получить доступ к полям непосредственно, как в:

public EmployeeClass(int id, string name, double salary) 
{ 
_id = id; 
_name = name; 
_salary = salary; 
} 

И ДЕЛАТЬ ВСЕ (по крайней мере те, которые должны иметь какой-то неизменности) только для чтения?

Какой лучший подход здесь?

Спасибо за Ваше мнение

+0

Как вы собираетесь использовать этот класс? В чем его цель? Это контекст, с помощью которого можно ответить на вопрос «как мне проектировать этот объект». –

ответ

2

Есть много отношений, два из них, что помогает избегая добытчик на классе являются:

В целом (и это только маленький вкус), не рекомендуется иметь много публичных разработчиков в классе.

+2

Я как бы согласен, но в этом есть предостережение в том, что это очень глубоко религиозная дискуссия. – BobbyShaftoe

+0

Я, конечно, не хочу начинать святую войну. Но это делает меня сумасшедшим.Я знаю, что есть много подходов, но я не хочу идти в одну сторону (или другой), а затем выяснять, что мне нужно реорганизовать (много) код, чтобы он работал. Argh! –

+1

Я думаю, что оба предыдущих комментария верны, подход зависит от контекста. Ориентирующий восток работает для меня, сочетая его с модульным тестированием, помогая мне создавать более удобный код, но, конечно же, для классов с логикой. Для простых объектов данных нет оснований быть фанатичными - общественные свойства get & set работают лучше :) – Elisha

1

Эрик Липперт имеет большой ряд на different kinds of immutability in c#. У него также есть несколько примеров того, как реализовать различные виды неизменности.

То, что он называет «неизменяемой однократной записью», является тем видом, в котором инициализация выполняется в конструкторе класса, а все поля помечены как поля private readonly.

2

Чтобы ответить на этот вопрос с точки языка конвенции зрения, до C# 3.0, доступ к внутренним данным был обычно выполняется путем объявления частных полей с открытыми свойствами, обеспечивая чтения и/или записи аксессоров:

public class Employee 
{ 
    private int _id; 

    public int Id 
    { 
     get { return _id; } 
     set { _id = this; } 
    } 
} 

Примечание. В .Net свойства находятся в PascalCase по соглашению.

В то время как цель свойств заключается в том, чтобы обеспечить инкапсуляцию при доступе к внутреннему состоянию объекта, свойства часто используются просто как проход через частный доступ к полю в качестве заполнителя в случае необходимости дополнительного поведения при доступе или вычислении штат. Поскольку эта модель приводит к большому количеству подробного и повторяющегося кодирования, Microsoft представила функцию Auto-Implemented Properties в C# 3.0. Авто свойства позволяют разработчику объявлять свойства, которые автоматически поддерживаются личными переменными:

public class Employee 
{ 
    public int Id { get; set; } 
} 
+0

Upvote, потому что я люблю использовать новые свойства 3.0 с помощью C#. Один мой профессор университета утверждает, что использование этих типов свойств является неправильным и спагетти-кодом. Идите фигуру. –

Смежные вопросы