
- •Основи програмної інженерії Тема 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. Шаблони проектування. Структурні шаблони.
- •Поняття шаблону проектування.
- •Основні елементи шаблону.
- •Механізми повторного використання.
- •Структурні шаблони проектування.
Застосування методів розширення до інтерфейсу
Можна створити також методи розширення, які застосовуються до інтерфейсу, що дозволяє викликати метод розширення для всіх класів, що реалізують інтерфейс. У лістингу 4 показаний клас ShoppingCart, оновлений з метою реалізації інтерфейсу IEnumerable <Product>.
Лістинг 4. Реалізація інтерфейсу в класі ShoppingCart
using System.Collections;
using System.Collections.Generic;
public class ShoppingCart : IEnumerable<Product> {
public List<Product> Products { get; set; }
public IEnumerator<Product> GetEnumerator() {
return Products.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
Тепер наш метод розширення можна оновити так, щоб він працював з інтерфейсом IEnumerable <Product> (див. лістинг 5).
Лістинг 5. Метод розширення, який працює з інтерфейсом
using System.Collections.Generic;
public static class MyExtensionMethods {
public static decimal TotalPrices(this IEnumerable<Product> productEnum) {
decimal total = 0;
foreach (Product prod in productEnum) {
total += prod.Price;
}
return total;
}
}
Тип першого параметра був змінений на IEnumerable <Product>, а це означає, що цикл foreach в тілі методу працює безпосередньо з об'єктом параметра. В іншому метод розширення залишився незміненим. Перехід до інтерфейсу означає, що ми можемо обчислити загальну вартість об'єктів Products, перерахованих будь-яким інтерфейсом IEnumerable <Product>, який включає в себе як екземпляри колекції ShoppingCart, так і масиви об'єктів Products (див. лістинг 6).
Лістинг 6. Застосування методу розширення до різних реалізацій одного інтерфейсу
using System;
using System.Collections.Generic;
class Program {
static void Main(string[] args) {
// create and populate ShoppingCart
IEnumerable<Product> products = new ShoppingCart {
Products = new List<Product> {
new Product {Name = "Kayak", Category = "Watersports", Price = 275M},
new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M},
new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M},
new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M}
}
};
// create and populate an array of Product objects
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}
};
// get the total value of the products in the cart
decimal cartTotal = products.TotalPrices();
// decimal arrayTotal = products.TotalPrices();
decimal arrayTotal = productArray.TotalPrices();
Console.WriteLine("Cart Total: {0:c}", cartTotal);
Console.WriteLine("Array Total: {0:c}", arrayTotal);
}
}
На замітку! Спосіб реалізації інтерфейсу IEnumerable<T> масивами C# дещо незвичний. Його НЕ вдасться знайти у списку реалізованих інтерфейсів у документації MSDN. Підтримка здійснюється компілятором, тому код, написаний для більш ранніх версій С#, також буде компілюватися. У цьому прикладі можна було б скористатися іншим узагальненим класом колекції, але приклад демонструє нюанси специфікації С #.
Якщо скомпілювати і запустити клас, наведений у лістингу 6, ви отримаєте наступні результати, які демонструють, що метод розширення повертає один і той же результат, незалежно від способу відбору об'єктів Product:
Cart Total: $ 378.40
Array Total: $ 378.40