Weekend Scripter: Основы.NET Framework – Hey, Scripting Guy! Blog

Резюме: Два Microsoft PFE рассказывают об основных элементах .NET Framework, имеющих отношение к Windows PowerShell на примере Active Directory.

Microsoft Scripting Guy Ed Wilson на связи. Сегодня я публикую вторую из пяти статей, написанных Adam Haynes с некоторой помощью его друга Shubert Somer. Первая статья серии здесь.

Давай, Адам.

В этом посте я бы хотел представить моего друга, developer PFE Shubert Somer. Shubert помог мне понять, что из себя представляет вся эта документация на сайте MSDN и как ее использовать в Windows PowerShell. Давайте чуть более пристально взглянем на концепции класса (class), объекта (object), метода (method), конструктора (constructor), свойства (property) и члена (member).

Shubert: Спасибо, Адам. Хотя вам не обязательно быть специалистом по объектно-ориентированному программированию (ООП) для работы с Windows PowerShell, все таки, Windows PowerShell широко использует объекты, поэтому вам стоит понимать принципы работы с ними.

Давайте рассмотрим чуть более подробно, что именно представляют из себя классы и зачем нам их использовать. В целом, класс – это способ собрать всю связанную функциональность в одном месте и отделить ее от других наборов связанного друг с другом функционала. Вы можете встретить термин инкапсуляция, используемый для описания этого аспекта ООП. Инкапсуляция в Windows PowerShell – это, наверное, самое важное свойство ООП, так что давайте немного ознакомимся с историей, чтобы понять, почему это так важно.

Я думаю, вы все знакомы с такими вещами, как переменные, используемые для хранения данных, и функции, которые используются для выполнения набора действий. Фактически, можно провести параллель между переменными и функциями – и свойствами и методами классов. Раньше, до появления ООП, все было в основном глобальным – у вас был большой файл кода, и каждая функция была доступна отовсюду. Таким образом, если вам нужно было открыть окно, чтобы вывести некоторые данные, или открыть файл, чтобы прочитать из него информацию, вам могли понадобиться, например, такие функции, как OpenWindow() и OpenFile(). По мере написания, код становился довольно громоздким, так как вам необходимо было добавлять некоторое описание в имя функции – для того, чтобы знать, для чего она предназначена, а также для того, чтобы имя каждой функции было уникальным. Хотя нечто подобное вы можете встретить и в ваших скриптах PowerShell, по мере того, как они увеличиваются в размерах и становятся более сложными.

Идея ООП заключается в том, чтобы собрать всю функциональность, относящуюся, например, к управлению окнами, и поместить ее в отдельный контейнер – класс. После этого, все переменные и функции, относящиеся к этому классу становятся дочерними по отношению к контейнеру и на них можно ссылаться более явным образом. Теперь старая функция OpenWindows() будет известна как Window.Open(), а функция OpenFile() – как File.Open(). Эти дочерние переменные и функции называются членами класса (class members), и мы называем такие переменные свойствами, а функции – методами.

Adam: OK, я понял. Мы можем получить некие данные из источника, например – файла, и передать их классу Window. Лично мне не так важно, как работают окна, я хочу лишь, чтобы информация, полученная из фала была отображена в одном из них.

Shubert: Точно. Основная идея здесь заключается в том, что эти контейнеры – классы, определяют все то, что могут делать объекты, созданные на их основе. Это делает их в значительной степени модульными и пригодными для повторного использования. Это также делает возможной работу таких вещей, как IntelliSense в VisualStudio и командлета Get-Member в PowerShell, который возвращает список всех членов данного класса.

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

Что это означает? В сущности, объект физически должен быть создан в системе, или, как это называется, должен быть создан его экземпляр (instantiate). Другими словами, в системе должно быть зарезервировано некоторое количество памяти для хранения определенных данных, возможно должны быть определены некоторые значения, установлены подключения к другим службам и т.д. Все это выполняется специальным методом, который называется конструктором (constructor). Принято, что имя этого метода – это имя самого класса.

Adam: Теперь мне становится понятно. Я разбирался с классом DirectoryContext на сайте MSDN и пытался понять, почему я могу получить доступ к свойствам и методам объекта используя знак точки “.”, однако я не мог таким же образом воспользоваться конструктором. Я полагаю, что я не могу использовать уже существующее окно для создания нового окна.

Shubert: Абсолютно верно. Поскольку конструкторы – это специальные методы, они используются несколько по-другому. Как мы говорили в первой статье серии, фактическое создание объекта производит .NET Framework, таким образом, нам нужен способ, чтобы сообщить системе, что мы хотим воспользоваться конструктором класса для создания нового объекта. В Windows PowerShell это делается посредством командлета New-Object, который делает за вас всю необходимую работу.

Adam: Таким образом, если я нахожу на MSDN класс, имеющий конструктор и я собираюсь его использовать, я могу это сделать через командлет New-Object. Однако я заметил, что там были четыре различных версии конструктора. Что это означает?

Shubert: Важно знать, что может быть несколько версий конструктора. Это потому, что вы можете передавать ему параметры, и различные наборы параметров определяют различные версии метода (это называется перегрузкой (overloading) метода). Именно поэтому вы видите четыре различных версии конструктора. Обычно различие состоит только в переопределении подразумеваемых значений или значений по умолчанию. Выбор нужного варианта зависит от того, что вам нужно, а также от технологии, управлять которой вы собираетесь, поэтому мы оставим это решение за вами. Ниже приведен скриншот части страницы класса DirectoryContext сайта MSDN с перегруженным конструктором.

01

Я хочу добавить, что перегружен может быть любой метод, не только конструктор. В каждом из этих случаев, MSDN содержит отдельную страницу для каждой перегрузки метода. Это довольно удобно, в случае, если вы ищете примеры использования или более детальную информацию о методе, так как некоторые из перегрузок могут документированы более подробно.

Итак, мы разобрали классы, которые определяют наборы связанной функциональности. Еще у нас есть объекты, экземпляры которых создаются посредством вызова метода конструктора определенного класса. Эти новые объекты обычно назначаются определенной переменной в вашем скрипте, и вы можете их использовать для всяческих полезных действий.

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

Adam: Я знал, что тут что-то не так.

Shubert: Да, это не совсем верно. Классы также могут определять свойства и методы, называющиеся статическими (static), которые доступны только через сам класс. На самом деле существует некий специальный объект для каждого класса, обладающего статическими членами – вы можете представить его как статический объект – и таких объектов по одному на класс в каждом экземпляре PowerShell.exe. Он создается перед тем как класс впервые задействуется в вашем скрипте и остается в памяти до завершения работы PowerShell. Статические члены обычно используются для определения полезного кода и вызываются с использованием имени класса, а не имени объекта. Важно то, что статические члены класса всегда доступны – вам не нужно сначала создавать экземпляр объекта, поскольку система уже создала для вас «статический объект». Мы рассмотрим несколько примеров в следующих статьях, где мы разберем наш скрипт построчно, а также познакомимся с некоторыми другими темами.

Adam: Перед тем как продолжить, я хочу сказать кое о чем, что так же помогло мне при работе с MSDN. Когда мы решали, в каком виде представить этот материал, Shubert предложил двигаться от начала к концу. Я с самого начала знал, что я хочу получить, и когда я нашел способ на MSDN, я продолжил двигаться дальше для достижения желаемого результата.

В этом конкретном случае, я знал, что мне нужно получить атрибут dsaSignature и я знал, что этот атрибут – часть метаданных репликации. Если бы я не знал, что именно я хочу получить в конце – все остальное не имело бы смысла. Именно поэтому мы сказали, что вам необходимо сначала ознакомиться с объектной моделью.

Я начал с поиска на http://msdn.microsoft.com/en-US/по фразе “replication metadata”. Я нашел большое количество полезной информации, включая примеры, которые помогли мне продвинуться в нужном направлении. Более конкретно, я нашел метод DirectoryServer.GetReplicationMetadata и начал продвигаться вверх по дереву навигации на левой стороне сайта. Я обнаружил класс DomainController, а также то, как найти контроллер домена с использованием объекта DirectoryContext.

Shubert: Действительно. Все материалы на MSDN содержат ссылки на другие темы. Каждый параметр метода содержит ссылку на класс этого параметра, и каждое свойство содержит ссылку на класс этого свойства. Так что начинайте поиск с того, что вы знаете и продвигайтесь по ссылкам дальше.

Adam: еще Мы только разогреваемся, так что я предлагаю вам перечитать этот пост, чтобы быть уверенными, что вы хорошо понимаете приведенные в нем концепции. Все это – фундамент для следующих постов. Если вы не можете сказать, что вам все понятно на 100% — это тоже нормально. Теперь, когда мы рассмотрели все необходимые концепции, мы можем заняться рассмотрением самого скрипта.

~Adam.

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/01/19/weekend-scripter-basics-of-net-framework-language.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

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

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s