EXtreme Programming XP Тема 3. XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар,

Slides:



Advertisements
Similar presentations
JUnit Tutorial Hong Qing Yu Nov JUnit Tutorial The testing problems The framework of JUnit A case study JUnit tool Practices.
Advertisements

EXtreme Programming XP Тема 8. XP Объектно-реляционное связывание позволяет связать реляционную базу данных и простые объекты Java. Обычно связывание.
SharePoint-hosted app
SharePoint 2013 apps to be or not to be. Alexander Krupsky Artur Kukharevich.
EXtreme Programming XP Тема 11. XP Для работы по администрированию таблицы Department создаем классы: DepartmentListController; EnterDepartmentController;
© Copyright 2012 Hewlett-Packard Development Company, L.P. The information contained herein is subject to change without notice. HP CarePack registration.
TAG- QUESTIONS. What are their types? What are differences between them?
Public class ABC { private int information = 0; private char moreInformation = ‘ ‘; public ABC ( int newInfo, char moreNewInfo) { } public ABC () {} public.
J-Unit Framework.
EXtreme Programming XP Тема 10. XP 1. Контроллеры (SimpleFormController, UrlFilenameViewController); 2. Модель и представление соединяются посредством.
ООП Классы. Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Астрометрические каталоги К.В.Куимов, ГАИШ МГУ. Определение астрометрического каталога Астрометрический каталог – понятие неопределённое. Например, это.
Системы с наследованием. Если систему можно представить в виде : Где - непрерывные функции, то такая система называется системой с наследованием. Математическое.
Некомпенсаторное агрегирование и рейтингование студентов Авторы: Гончаров Алексей Александрович, Чистяков Вячеслав Васильевич. НФ ГУ ВШЭ 2010 год.
Учитель математики Кулакова Т.М. МОУ ООШ №15 г.о Новокуйбышевск Самарской области Сентябрь 2011г.
Российский государственный педагогический университет им. А.И. Герцена ИНСТИТУТ ДОВУЗОВСКОЙ ПОДГОТОВКИ Дистанционное обучение «Русский язык. Подготовка.
ООП Классы – 2. Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10;
Делегаты. Как созданные объекты могут посылать сообщения тем объектам, которые их породили? При программировании под Windows на С и C++ основное средство.
Особенности Java. Блок static static { } Создание и уничтожение объектов  new – создание объекта  finalyze()
Язык JavaScript Скриптовый язык для выполнения на html-страницах.
Введение в параллельные вычисления. Технология программирования MPI (день седьмой) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Язык SmallTalk «Чистый» объектно- ориентированный язык.
Анатомия класса. Схожесть с др. языками   С# похож на язык Java в том, что он требует, чтобы вся программная логика была заключена в определения типов.
Основы цифровой обработки речевых сигналов. Общая схема процесса речеобразования x[n] – дискретные отсчеты сигнала возбуждения y[n] – дискретные отсчеты.
Сравнение различных методов хранения XML в реляционных базах данных и в разных системах. Нгуен Тхань Хуен- 545 группа Руководитель : Б.А. Новиков Рецензент:
PHP как язык программирования. Типы данных логические величины int, integer – целые числа real, double, float – вещественные числа string – строки array.
Контейнеры. Сортировка  Метод sort()  Интерфейс Comparable метод int compareTo(Object o) вызов: Arrays.sort(a)  Интерфейс Comparator метод int compare(Object.
Синтаксис языка Java.
Ряды и произведения sum(expr, n=a..b), где expr – выражение, зависящее от индекса суммирования, a..b – пределы индекса суммирования, Если требуется вычислить.
Пользовательские действия (custom actions) в JSP. JSTL.
Особенности языка JavaScript и его использования.
Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»
Коллекции. Пространство имен System.Collections Наиболее простой вариант набора элементов — это массив System. Array. Он уже обладает весьма полезными.
Проект «Безопасный браузер» Визовитин Николай Кадашев Дмитрий.
События. События Важная роль делегатов заключается в том, что на них основана модель событий С#. Применение событий вовсе не ограничено приложениями с.
Обработка исключений Гудов А.М., Завозкин С.Ю
1 (с) ИТЛаб, ННГУ, ВМК, 2003г Java 2 Micro Edition Жерздев С.В. Java 2 Micro Edition Лаборатория информационных технологий (ИТЛаб) При поддержке фирмы.
0 + 0= = = = 10 Арифметические операции во всех позиционных системах счисления выполняются по одним и тем же хорошо известным вам правилам.
Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 1 Основы программирования на языке Java Средства ООП Java.
Visual Basic 7 Объектно-ориентированный язык программирования.
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
Нескучное тестирование с pytest
1 Testing With The JUnit Framwork Carl-Fredrik Sørensen, PhD Fellow
КРУПНЕЙШАЯ ТЕХНИЧЕСКАЯ КОНФЕРЕНЦИЯ MICROSOFT В УКРАИНЕ Metro приложения: работа с данными Краковецкий Александр, MVP/RD/PhD. DevRain Solutions.
Алгебра логики это раздел математики, изучающий высказывания, рассматриваемые со стороны их логических значений (истинности или ложности) и логических.
Software Engineering, 2005Test-Driven Development 1 Test-Driven Development Software Engineering Test-Driven Development Mira Balaban Department of Computer.
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(“two"); lst.add(“three");
HTTP ANDROID CLUB 2015.
JUnit A framework which provides hooks for easy testing of your Java code, as it's built Note: The examples from these slides can be found in ~kschmidt/public_html/CS265/Labs/Java/Junit.
Anekdot ANDROID CLUB Сегодня  Navigation Drawer  CardView  Calligraphy  TextToSpeech.
A: A: double “4” A: “34” 4.
Стеки и очереди 1. Абстрактный стек public interface Stack { static class Underflow extends Exception { public Underflow() { super("Stack underflow");
Topic: Junit Presenters: Govindaramanujam, Sama & Jansen, Erwin.
JavaScript
Современные технологии баз данных
Tashkent Weather ANDROID CLUB 2015.
ВЫПИСКА из протокола №__ Ученого (Научно-технического) совета (НОИ) _______ от «__»_________2017 СЛУШАЛИ: аспиранта ФИО (руководитель степень, должность.
ADO.NET Data Services (codename Astoria)
Сетевое взаимодействие
Review Operation Bingo
Класс Object Макаревич Л. Г..
null, true, and false are also reserved.
Решение типовых расчетных задач по формулам. Определение массовой доли элементов Массовая доля элемента ω(Э) % - это отношение массы данного элемента.
КАК НА ЗАКОННОМ ОСНОВАНИИ ОТКАЗАТЬСЯ ОТ ПРОВЕДЕНИЯ ВАКЦИНАЦИИ?
Сортировка, поиск и фильтрация данных в базе данных и выборках
* Любой табак кроме WTO Депозит берется в течение 20 мин, как подошли все гости* В депозит входят все позиции в меню* Депозит не возвращается*
Форма хостес. Форма хостес Leto Lounge: Красный низ штаны/юбка Черная футболка Хостес сами закупают форму Пиджак красный/черный ( выдает ст.кальянщик.
ПРИНЯТИЕ БРОНИ.
ПРИНЯТИЕ БРОНЕЙ. ОСНОВНЫЕ ФРАЗЫ ПРИ ПРИНЯТИИ БРОНИ ПО ТЕЛЕФОНУ 1. Leto Lounge, (Петровка, Дубровка, Фрунзенская)/ Проект 6/2, имя, приветствие. 2. Уточнение.
Presentation transcript:

eXtreme Programming XP Тема 3

XP Пусть есть некоторая информационная система для банков. В качестве основной валюты для расчетов используется доллар, для работы с которым был реализован класс Dollar. В условиях кризиса требовалось перевести систему на мультивалютные расчеты.

XP $5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 public void testMultiplication() { Dollar five=new Dollar(5); five.times(2); assertEquals(10.,five.amount); } public class Dollar { double amount; Dollar (double amount) {} void times(int mult) {} }

XP При объявлении переменной amount: double amount=5*2; В методе times: void times(int mult){ amount=5*2;} Изменения должны быть и в конструкторе, и в методе times: Dollar (double amount){this.amount=amount;} void times(int mult) {amount*=mult;}

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин Тест, который не выполняется: public void testMultiplication() { Dollar five=new Dollar(5); five.times(2); assertEquals(10.,five.amount); five.times(3); assertEquals(15.,five.amount); } XP

Изменение метода times: Dollar times(int mult) { return new Dollar(amount*mult); } Изменение теста: public void testMultiplication() { Dollar five=new Dollar(5); Dollar product=five.times(2); assertEquals(10.,product.amount); product=five.times(3); assertEquals(15.,product.amount); } XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Тест на равенство: public void testEquality() { assertTrue(new Dollar(5).equals(new Dollar(5))); } Тест не работает – нужна заглушка метода equals. public boolean equals(Object obj){return true;} XP

Не работает другой тест: public void testEquality() { assertTrue(new Dollar(5).equals(new Dollar(5))); assertFalse(new Dollar(5).equals(new Dollar(6))); } Требуется изменить метод equals: public boolean equals(Object obj) { Dollar dollar=(Dollar)obj; return amount==dollar.amount; } XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов XP

Меняем тест – сравниваем на равенство объекты: public void testMultiplication() { Dollar five=new Dollar(5); assertEquals(new Dollar(10),five.times(2)); assertEquals(new Dollar(15),five.times(3)); } XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов 5 CHF*2=10 CHF XP

Добавляем новый класс Franc (код из класса Dollar); Пишем тест: public void testFrancMultiplication() { Franc five=new Franc(5); assertEquals(new Franc(10),five.times(2)); assertEquals(new Franc(15),five.times(3)); } XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов 5 CHF*2=10 CHF Дублирование Dollar/Franc Общие операции equals() Общие операции times() XP

Создадим класс Money, от которого наследуют Dollar и Franc Перенесем в него переменную amount. Для выполнения всех тестов требуется сделать ее protected. XP

Меняем в классе Dollar метод equals – перенос на тип данных Money public boolean equals(Object obj) { Money money=(Money)obj; return amount==money.amount; } Переносим метод в класс Money и удаляем из классов Dollar и Franc. Тест: public void testEquality() { assertTrue(new Dollar(5).equals(new Dollar(5))); assertFalse(new Dollar(5).equals(new Dollar(6))); assertTrue(new Franc(5).equals(new Franc(5))); assertFalse(new Franc(5).equals(new Franc(6))); } XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов 5 CHF*2=10 CHF Дублирование Dollar/Franc Общие операции equals() Общие операции times() Сравнение долларов и франков XP

Тест: public void testEquality() { assertTrue(new Dollar(5).equals(new Dollar(5))); assertFalse(new Dollar(5).equals(new Dollar(6))); assertTrue(new Franc(5).equals(new Franc(5))); assertFalse(new Franc(5).equals(new Franc(6))); assertFalse(new Franc(5).equals(new Dollar(5))); } Изменение метода: public boolean equals(Object obj) { Money money=(Money)obj; return amount==money.amount && getClass().equals(money.getClass()); } XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов 5 CHF*2=10 CHF Дублирование Dollar/Franc Общие операции equals() Общие операции times() Сравнение долларов и франков Валюта? XP

Методы times могут возвращать Money Money times(int mult) { return new Dollar(amount*mult); } В результате классы почти одинаковые -> хочется сделать только один класс XP

В класс Money добавим фабричный метод создания объекта Dollar: static Dollar dollar(double amount) {return new Dollar(amount);} Меняем принцип создания объекта в тесте: public void testMultiplication() { Money five=Money.dollar(5); assertEquals(Money.dollar(10),five.times(2)); assertEquals(Money.dollar(15),five.times(3)); } Осталась ошибка – метод times не определен в классе Money XP

Делаем класс Money абстрактным, добавляя в него абстрактный метод times. abstract class Money { protected double amount; … abstract Money times(int mult); } Меняем фабричный метод с точки зрения возвращаемого значения static Money dollar(double amount) {return new Dollar(amount); } XP

Делаем те же действия с классом Franc Меняем тесты public void testEquality() { assertTrue(Money.dollar(5).equals(Money.dollar(5))); assertFalse(Money.dollar(5).equals(Money.dollar(6))); assertTrue(Money.franc(5).equals(Money.franc(5))); assertFalse(Money.franc(5).equals(Money.franc(6))); assertFalse(Money.franc(5).equals(Money.dollar(5))); } XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов 5 CHF*2=10 CHF Дублирование Dollar/Franc Общие операции equals() Общие операции times() Сравнение долларов и франков Валюта? Нужен ли тест на умножения франков на число? XP

Добавляем метод для получения названия валюты в классы Dollar и Franc и абстрактный метод в класс Money: abstract String currency(); String currency(){ return "USD";} String currency(){ return "CHF";} Тест public void testCurrency() { assertEquals("USD",Money.dollar(1).currency()); assertEquals("CHF",Money.franc(1).currency()); } XP

Вводим символьную переменную для обозначения валюты в класс Money и переносим функцию currency полностью в класс Money abstract class Money { protected double amount; protected String currency; … String currency(){ return currency; } } Конструкторы должны инициализировать эту строку, например, Franc (double amount) { this.amount=amount; this.currency="CHF"; } XP

Конструкторы производных классов похожи -> можно инициализировать переменную currency внутри конструктора базового класса: public Money(double amount, String currency) { this.amount=amount; this.currency=currency; } Конструкторы производных классов выглядят, например, так: Franc (double amount) { super(amount,"CHF"); } Можно добавить второй параметр с обозначением валюты и передавать его конструктору базового класса XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов 5 CHF*2=10 CHF Дублирование Dollar/Franc Общие операции equals() Общие операции times() Сравнение долларов и франков Валюта? Нужен ли тест на умножения франков на число? XP

Функция times класса Dollar выглядит так: Money times(int mult) { return Money.dollar(amount*mult);} Вернемся к вызову конструктора: Money times(int mult) { return new Dollar(amount*mult,USD");} Строку с названием валюты можно получить из поля currency-> переносим в класс Money (класс перестает быть абстрактным) Money times(int mult){ return new Money(amount*mult,currency);} Тест не срабатывает – сравнение имен классов (один объект класса Dollar, другой – класса Money). XP

Вернемся к методам times внутри производных классов, например, в Dollar Money times(int mult) {return new Dollar(amount*mult,currency);} Тесты сработали. Добавляем тест для сравнения объектов, созданных с помощью Money и Dollar public void testDifferentClasses() { assertTrue(new Money(10,"CHF").equals(new Franc(10,"CHF"))); } Тест не сработал. XP

Меняем equals – сравнение названий валют, а не имен классов. public boolean equals(Object obj) { Money money=(Money)obj; return amount==money.amount && currency.equals(money.currency); } Тесты сработали. Снова отказываемся от методов times производных классов. Тесты сработали. XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов 5 CHF*2=10 CHF Дублирование Dollar/Franc Общие операции equals() Общие операции times() Сравнение долларов и франков Валюта? Нужен ли тест на умножения франков на число? XP

Производные классы имеют только конструкторы. Отказываемся от них. Методы-фабрики должны вызывать конструктор класса Money. static Money franc(double amount) { return new Money(amount,"CHF"); } Тест на равенство объектов разных классов и умножение франков можно удалить. XP

$5+10 CHF =$10, если курс обмена 2:1 $5*2=$10 amount-закрытая переменная Побочные эффекты в классе Dollar – изменение объекта Округление денежных величин equals() Равенство значению null Равенство объектов 5 CHF*2=10 CHF Дублирование Dollar/Franc Общие операции equals() Общие операции times() Сравнение долларов и франков Валюта? Нужен ли тест на умножения франков на число? $5+$5=$10 XP

Реализуем тест: public void testSimpleAddition() { Money sum=Money.dollar(5).plus(Money.dollar(5)); assertEquals(sum,Money.dollar(10)); } В класс Money добавляем функцию plus: Money plus(Money added) { return new Money(amount+added.amount,currency); } XP

Обменный курсы должен знать банк -> создаем класс Bank (в нем метод reduce для перевода денег в конкретную валюту). XP

Тест: public void testSimpleAddition() { Money five=Money.dollar(5); Money sum=five.plus(five); Bank bank=new Bank(); Money reduced=bank.reduce(sum, "USD"); assertEquals(sum,Money.dollar(10)); } В классе Bank должна быть заглушка: public class Bank { Money reduce(Money source, String to) {return Money.dollar(10); } } Метод plus возвращает Money. XP

Тесты: public void testReduceMoney() { Bank bank=new Bank(); bank.addRate("CHF","USD",2); Money result=bank.reduce(Money.franc(2), "USD"); assertEquals(Money.dollar(1),result); } public void testHashRates() { Bank bank=new Bank(); bank.addRate("CHF", "USD", 2); assertTrue(bank.rate("CHF", "USD")==2.); } XP

В классе Bank создаем хэш-таблицу: private class Pair { private String from; private String to; public Pair(String from, String to) { this.from=from; this.to=to; } public boolean equals(Object obj) { Pair p=(Pair)obj; return from.equals(p.from) && to.equals(p.to); } public int hashCode(){ return 0; } } private Hashtable rates=new Hashtable(); XP

void addRate(String from, String to, double rate) { rates.put(new Pair(from,to), new Double(rate)); } double rate(String from, String to) { Double rate=(Double)rates.get(new Pair(from,to)); return rate.doubleValue(); } XP

Делаем метод-заглушку класса Bank: Money reduce(Money source,String to) { double rate=1; if (source.currency.equals("CHF") && to.equals("USD")) rate=2.; if (source.currency.equals("USD") && to.equals("CHF")) rate=1./2; return new Money(source.amount/rate,to); } XP

Изменяем заглушку: Money reduce(Money source,String to) { double rate=1; Pair p=new Pair(source.currency,to); if (rates.containsKey(p)) rate=rate(source.currency,to); return new Money(source.amount/rate,to); } XP

Изменяем тест public void testReduceMoney() { Bank bank=new Bank(); bank.addRate("CHF","USD",2); Money result=bank.reduce(Money.franc(2), "USD"); assertEquals(Money.dollar(1),result); result=bank.reduce(Money.dollar(2), "USD"); assertEquals(result,Money.dollar(2)); result=bank.reduce(Money.dollar(2), "CHF"); assertEquals(result,Money.franc(4)); } Тест не работает, так как если курса нет, то в хэш-таблице ничего не будет найдено. XP

Добавлять надо два курса void addRate(String from, String to, double rate) { rates.put(new Pair(from,to), new Double(rate)); rates.put(new Pair(to,from), new Double(1/rate)); } XP