
- •Основи програмної інженерії Тема 1. Поняття програмної інженерії. Вступ
- •Процес створення програмного забезпечення
- •Моделі технологічного процесу створення пз
- •Моделі процесу розробки по
- •Характеристики якісного пз
- •Тема 2. Види моделей систем. Поняття і класифікація вимог до програмної системи.
- •Способи запису специфікацій вимог.
- •Види моделей систем.
- •Мова моделювання uml.
- •Об'єктні моделі
- •Інструментальні case-засоби.
- •Тема 3. Поняття архітектурного проектування. Архітектурні моделі.
- •Архітектурний шаблон mvc.
- •Особливості шаблону mvc.
- •Модель проблемної сфери.
- •Тема 4. Важливі функціональні засоби мови c#. Автоматично реалізовані властивості.
- •Ініціалізатори об'єктів та колекцій.
- •Автоматичне виведення типу.
- •Анонімні типи.
- •Використання методів розширення Методи розширення
- •Застосування методів розширення до інтерфейсу
- •Створення фільтруючих методів розширення
- •Тема 5. Лямбда-вирази. Мова linq. Лямбда-вирази.
- •Мова linq.
- •Методи розширення linq.
- •Відкладені запити linq.
- •Тема 6. Створення слабо зв'язаних компонентів. Впровадження залежності.
- •Контейнери впровадження залежності.
- •Бібліотека Ninject.
- •Порядок роботи з Ninject.
- •Тема 7. Засоби доступу до даних. Технологія ado.Net.
- •Реалізація доступу до даних.
- •Робота з даними.
- •Тема 8. Тестування пз. Розробка через тестування. Автоматизоване тестування пз та його види.
- •Розробка через тестування. Робочий потік "червоний-зелений-рефакторинг".
- •Модель "організація.Дія.Твердження".
- •Використання бібліотеки Moq
- •Тема 9. Проектування інтерфейсу користувача. Інтерфейс користувача.
- •Переваги графічного інтерфейсу.
- •Процес проектування графічного інтерфейсу.
- •Принципи проектування інтерфейсів користувача.
- •Шаблони.
- •Тема 10. Основи інженерії вимог. Розробка вимог.
- •Формування і аналіз вимог.
- •Опорні точки зору.
- •Сценарії.
- •Атестація вимог.
- •Тема 11. Прототипування програмних систем. Поняття прототипування.
- •Переваги прототипування.
- •Види прототипування.
- •Технології швидкого прототипування.
- •Тема 12. Покомпонентна розробка. Компоненти і класи об'єктів.
- •Компоненти як постачальники послуг.
- •Рівні абстракції компонентів.
- •Вимоги до компонентів.
- •Тема 13. Шаблони проектування. Структурні шаблони.
- •Поняття шаблону проектування.
- •Основні елементи шаблону.
- •Механізми повторного використання.
- •Структурні шаблони проектування.
Анонімні типи.
Поєднуючи ініціалізатори об'єктів і виведення типів, можна створювати прості об'єкти сховища даних без необхідності визначення відповідного класу або структури. Приклад наведено в лістингу 9.
Лістинг 9. Створення анонімного типу
var myAnonType = new (
Name = "MVC",
Category = "Pattern"
};
Console.WriteLine ("Name: {0}, Type: {1}",
myAnonType.Name, myAnonType.Category);
У цьому прикладі myAnonType – анонімно типізований об'єкт. Це не означає, що він є динамічним e тому сенсі, в якому динамічно типізовані змінні JavaScript. Просто визначення типу буде автоматично створюватися компілятором. Строга типізація, як і раніше, залишається в силі. Наприклад, можна отримувати і встановлювати тільки ті властивості, які визначені у ініціалізаторі.
Компілятор C# генерує клас на основі імені і типу параметрів у ініціалізаторі. Два анонімно типізованих об'єкти, які мають однакові імена і типи властивостей, будуть призначені до одного й того ж автоматично згенерованого класу. Це означає, що можна створювати масиви анонімно типізованих об'єктів, як показано в лістингу 10.
Лістинг 10. Створення масиву анонімно типізованих об'єктів
using System;
class Program {
static void Main(string[] args) {
var oddsAndEnds = new[] {
new { Name = "MVC", Category = "Pattern"},
new { Name = "Hat", Category = "Clothing"},
new { Name = "Apple", Category = "Fruit"}
};
foreach (var item in oddsAndEnds) {
Console.WriteLine("Name: {0}", item.Name);
}
}
}
Потрібно звернути увагу на те, що для оголошення масиву змінних використано ключове слово var . Це обов'язково, оскільки ми не володіємо типом, який можна було б вказати, як мало б місце у випадку зі звичайним типізованим масивом. Навіть притому, що ми не визначили клас ні для одного з цих об'єктів, все ж можна перерахувати вміст масиву і виконати читання значення властивості Name з кожного з них. Це важливо, оскільки без цієї функціональної можливості взагалі не можна було б створювати масиви анонімно типізованих об'єктів. Або, вірніше, ми змогли б створювати масиви, але не змогли б виконувати над ними ніяких корисних дій.
Використання методів розширення Методи розширення
Методи розширення – це зручний спосіб додавання методів в класи, власником яких ви не є і, отже, не можете змінювати їх безпосередньо. У лістингу 1 міститься код класу ShoppingCart, що представляє колекцію об'єктів Products.
Лістинг 1. Клас ShoppingCart
using System.Collections.Generic;
public class ShoppingCart {
public List<Product> Products { get; set; }
}
ShoppingCart – це простий клас, який діє як оболонка колекції List об'єктів Product (для цього прикладу необхідний тільки базовий клас). Припустимо, що нам потрібно мати можливість визначення загальної вартості об'єктів Product в класі ShoppingCart, але ми не можемо змінювати сам клас, можливо тому, що він поступає звідкись ззовні, і ми не володіємо його вихідним кодом. У такому випадку для отримання необхідної функціональності можна використовувати метод розширення, як показано в лістингу 2.
Лістинг 2. Визначення методу розширення
public static class MyExtensionMethods {
public static decimal TotalPrices (this ShoppingCart cartParam) {
decimal total = 0;
foreach (Product prod in cartParam.Products) {
total + = prod.Price;
}
return total;
}
}
Ключове слово this, розташоване перед першим параметром, позначає TotalPrices як метод розширення. Перший параметр вказує .NET, до якого класу може застосовуватися метод розширення – в даному випадку до ShoppingCart. На екземпляр ShoppingCart, до якого застосовано метод розширення, можна посилатися за допомогою параметра cartParam. Наш метод виконує перерахування допомогою Products в ShoppingCart і повертає суму властивості Product.Price. Застосування методу розширення продемонстровано в лістингу 3.
Лістинг 3. Застосування методу розширення
using System;
using System.Collections.Generic;
class Program {
static void Main(string[] args) {
Product[] productArray = {
new Product {Name = "Kayak", Price = 275M},
new Product {Name = "Lifejacket", Price = 48.95M},
new Product {Name = "Soccer ball", Price = 19.50M},
new Product {Name = "Corner flag", Price = 34.95M}
};
decimal cartTotal = cart.TotalPrices ();
Console.WriteLine("Total: {0: c} ", cartTotal);
}
}
Код в лістингу створює колекцію ShoppingCart і заповнює її об'єктами Product, використовуючи засіб ініціалізатора об'єкта. Оператор, який застосовує метод розширення, виділений напівжирним. Як бачите, ми просто викликаємо метод, неначе він є частиною класу ShoppingCart. Зверніть також увагу, що метод розширення не був визначений у тому ж самому класі, в якому ми його використали. Середовище .NET знайде класи розширення, якщо вони знаходяться в області дії поточного класу – тобто є частиною того ж самого простору імен або простору імен, який зазначено в операторі using. Виведення класу, наведеного в лістингу 3, має наступний вигляд:
Total: $ 378.40
На замітку! Методи розширення НЕ дозволяють порушувати правила доступу, які задані класами для своїх методів, полів і властивостей. Функціональність класу можна розширити за допомогою методу розширення, але з використанням тільки тих членів, до яких у будь-якому випадку є доступ.