2010-06-29 1 views
10

Я думаю, что если класс будет создан только в другом классе, поэтому правильно использовать его вложенным в этот класс. Я думаю, что это поможет нам в хорошем дизайне. Когда я смотрю на свой проект, я почти никогда не видел таких вложенных structure.Но если я пытаюсь вложенных классов, поэтому на этот раз в моем сознании появятся другие вопросы. Например,Где и как использовать вложенные классы?

У меня есть класс Board, перемещайте классы, такие как ShortCastle, LongCastle, EnPassant, Promote и Pieces, такие как Pawn, Queen, Rook, Рыцарь и т. Д. Итак, ясно, что классы классов будут создавать экземпляры классов Piece, а классы Piece будут создавать классы Move. Для хорошего дизайна Promote move class должен быть вложен в Pawn, потому что только пешка может продвигать себя. Короткий и длинный замок должен быть вложен в King, потому что только король может иметь такой тип движений.

Попытка положить все классы Piece в класс Board не похожа на хороший дизайн, потому что класс 8-9 будет внутри класса Board, и это действительно будет раздражать один файл класса Board будет слишком большим и едва читаемым. Я предпочитаю, чтобы каждый класс в другом файле. Хорошо, что мы можем создать частичный класс Board, но все же это не раздражает 8-9. Файлы классов Partial Board будут содержать каждый класс штук? Не лучше ли сделать их вложенными? То же самое о Pieces Создайте еще один частичный файл Piece только для другого класса типа Move? Если вложенный класс просто занимает небольшое пространство, значит, это не проблема, но если требуется много методов?

ответ

11

Я думаю, что вы слишком щедры с вложенными классами. Посмотрите на this руководство по проектированию для вложенных типов.

Не используйте вложенные типы, если выполняются следующие условия:

  • Тип должен быть создан с помощью клиентского кода. Если тип имеет общедоступный конструктор , он, вероятно, не должен быть вложенным . Обоснованием этой директивы является то, что если вложенный тип может быть создан, он указывает , что тип имеет место в библиотеке самостоятельно. Вы можете создать его, использовать его и уничтожить без используя внешний вид. Следовательно, он не должен быть вложенным . Внутренний тип не должен широко использоваться снаружи внешнего типа без отношения к внешнему типу.
  • Ссылки на тип обычно , указанные в клиентском коде.

Кусочки могут принадлежать к доске (Piece-collection как член?), Но могут сосуществовать без нее. Вы могли бы f.e. хотите повторно использовать доски без кусков (темы и т. д.), а также повторно использовать куски без доски (позиции и т. д.).

2

Частные члены из родительского класса доступны для методов Nexted Class.

Следующий класс позволяет уменьшить сложность без широкого охвата.

0

Если вы действительно считаете, что вложенные классы имеют смысл для вашего дизайна (см. Указания Тима Шмельтера), но чувствуйте, что размер файла слишком велик, использование частичных классов идеально подходит для разделения вложенных определений классов на свои собственные файлы. Или, если вложенные классы достаточно малы сами по себе, но у вас их большое количество, поместите все вложенные классы в один неполный файл.

Родитель.CS:

public partial class Parent 
{ 
    void SomeMethod() 
    { 
     Nested1 n1 = new Nested1(); 
     Nested2 n2 = new Nested2(); 
    } 
} 

Nested.cs:

public partial class Parent 
{ 
    private class Nested1 
    { 

    } 
    private class Nested2 
    { 

    } 
} 
1

Для хорошего дизайна, Продвинуть класс перемещения должны быть вложены в пешки, потому что только пешка может рекламировать себя.

Я действительно не согласен. Просто потому, что вы можете классы гнезд не означает, что вы должны. Спросите себя, какую выгоду вы получаете от гнездования этих классов.

+0

Вы ограничиваете возможности ошибок с помощью этого дизайна. Ни один из других Pieces не может создать такой ход, даже ошибочно. Этот дизайн не позволяет это. Я ошибаюсь? – Freshblood

+0

Глубокие классы вложенности ограничивают их область действия (что может быть полезным архитектурным ограничением в определенных сценариях), но в начале вашего проекта вы испытываете большую сложность. Я бы рекомендовал сделать «простейшую вещь, которая могла бы работать», а затем реорганизовать на более сложный дизайн, когда возникнет такая необходимость. Позже, если вы хотите ограничить создание определенных классов, вы можете разбить свое решение на разные сборки (создав проекты «Библиотека классов»). Удачи! =) –

0

Вложенные классы имеют свое место, но могут смущать работу. Я нашел веб-страницу, в которой показано, как использовать некоторые .Net-классы для получения JSON-выхода на стене в Facebook по адресу http://www.virtualsecrets.com/graph-api-json-facebook-handler.html. Интересно, что классы вложены внутри классов, внутри других классов - так что это можно сделать, просто битный комплекс. :)

+0

Насколько я понимаю, эта статья не о вложенных классах, это всего лишь вложенные объекты. Это совершенно другое. – Freshblood