
- •Основи програмної інженерії Тема 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. Шаблони проектування. Структурні шаблони.
- •Поняття шаблону проектування.
- •Основні елементи шаблону.
- •Механізми повторного використання.
- •Структурні шаблони проектування.
Створення фільтруючих методів розширення
Останній аспект методів розширення, який ми хочемо згадати - можливість їх застосування для фільтрації колекцій об'єктів. Метод розширення, який діє по відношенню до інтерфейсу IEnumerable <T> і який також повертає IEnumerable <T>, може використовувати ключове слово yield, щоб застосувати критерій відбору до елементів у джерелі даних для створення зменшеного набору результатів. Такий метод показаний в лістингу 7.
Лістинг 7. Фільтруючий метод розширення
public static IEnumerable<Product> FilterByCategory(
this IEnumerable<Product> productEnum, string categoryParam) {
foreach (Product prod in productEnum) {
if (prod.Category == categoryParam) {
yield return prod;
}
}
}
Якщо використовується ключове слово yield в інструкції, то це означає , що метод , оператор або метод доступу get в якому воно зустрічається, є ітератором. Ітератор можна використовувати для виконання настроюваної ітерації по колекції (тобто для перебору елементів колекції). У наступному прикладі показано дві форми запису оператора yield:
yield return <expression> ;
yield break ;
Використовуйте вираз yield return для повернення по черзі кожного елемента.
Можна використовувати вираз yield break для завершення ітерації.
Метод-ітератор використовується, наприклад, в операторі foreach. Кожна ітерація циклу foreach викликає метод-ітератор. Коли в методі-ітераторі зустрічається оператор yield return, повертається вираз expression і зберігається поточне положення в коді. Виконання буде продовжено з цього місця розташування при черговому виклику функції ітератора.
Метод розширення FilterByCategory приймає додатковий параметр, який дозволяє вставляти умову фільтрації при виклику методу. Об'єкти Product, властивість Category яких відповідає параметру, повертаються в результаті IEnumerable <Product>, а ті, чия властивість не відповідає – відкидаються. Використання цього методу показано в лістингу 8.
Лістинг 8. Використання фільтруючого методу розширення
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}
}
};
foreach (Product prod in products.FilterByCategory ("Soccer") ) {
Console.WriteLine ("Name: {0}, Price {1: c}", prod.Name, prod.Price);
}
}
}
При виклику методу FilterByCategory у відношенні до ShoppingCart повертаються тільки ті об'єкти Product, які відносяться до категорії Soccer. Після компіляції і виконання цього методу ми отримуємо наступні результати:
Name: Soccer ball, Price $ 19.50
Name: Corner flag, Price $ 34.95
І, звичайно, методи розширення можна використовувати подібно будь-яким іншим і об'єднувати їх в ланцюжки. Наприклад, можна відфільтрувати об'єкти Product, які належать до категорії Soccer, а потім передати результати методу TotalPrices, щоб додати їх до значення властивості Price, як показано в лістингу 9.
Лістинг 9. Об'єднання методів розширення в ланцюжок
…
decimal total = products.FilterByCategory ("Soccer"). TotalPrices ();
Console.WriteLine ("Filtered total: {0: c} ", total);
…
Нижче показаний результат виконання цих операторів:
Filtered total: $ 54.45