Java 2013 — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
(Условие контрольной работы)
(Условия получения зачета)
 
(не показано 20 промежуточных версий 3 участников)
Строка 6: Строка 6:
  
 
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&output=html Текущий рейтинг]
 
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&output=html Текущий рейтинг]
 +
 +
== Условия получения зачета ==
 +
 +
Общие условия получения зачета - зачесть контрольную работу (для этого договориться с АМ о том, когда ее написать), сдать 9 лабораторных работ, устно побеседовать с преподавателем. Итоговая оценка будет ставиться исходя из количества набранных баллов и ваших ответов в устной беседе.
 +
 +
Примерное количество баллов
 +
#на оценку удовлетворительно - 60
 +
#на оценку хорошо - 70
 +
#на оценку отлично - 80
  
 
== Лекции ==
 
== Лекции ==
Строка 15: Строка 24:
 
*[[Медиа:Java_2013_05.ppt|Лекция 5 (часть 2)]]
 
*[[Медиа:Java_2013_05.ppt|Лекция 5 (часть 2)]]
 
*[[Медиа:Java_2013_05-2.ppt|Лекция 6]]
 
*[[Медиа:Java_2013_05-2.ppt|Лекция 6]]
*[[Медиа:Java_2013_06.ppt|Лекция 7]]
+
*[[Медиа:Java_2013_06.ppt|Лекция 7 (Reflection)]]
 +
*[[Медиа:Java_2013_08.ppt|Лекция 8 (Многопоточное программирование)]]
 +
*[[Медиа:Java_2013_09.ppt|Лекция 9 (java.util.concurrent)]]
 +
*[[Java_Swing_2013|Лекция 10]]
 +
*[[Java_Serialization_2013|Лекция 11]]
  
== Домашние задания ==
+
== Задания ==
 
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля
 
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля
 
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля
 
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля
Строка 25: Строка 38:
 
* [http://mit.spbau.ru/sewiki/images/7/79/Java_hmw_2013_04_03.pdf Шестое задание] срок сдачи: 3 апреля
 
* [http://mit.spbau.ru/sewiki/images/7/79/Java_hmw_2013_04_03.pdf Шестое задание] срок сдачи: 3 апреля
 
* [http://mit.spbau.ru/sewiki/images/f/fb/Java_hmw_2013_04_10.pdf Седьмое задание] срок сдачи: 10 апреля
 
* [http://mit.spbau.ru/sewiki/images/f/fb/Java_hmw_2013_04_10.pdf Седьмое задание] срок сдачи: 10 апреля
 
+
* [[Java 2013 CW1|Контрольная работа]]
 +
* [[Java_2013_HW8|Восьмое задание]] срок сдачи: 17 апреля
 +
* [http://mit.spbau.ru/sewiki/images/4/4c/Java_hmw_2013_9.pdf Девятое задание] срок сдачи 1 мая <b>или</b> [http://mit.spbau.ru/sewiki/images/7/75/Java_2013_10.pdf Десятое задание] срок сдачи 15 мая и вес <b>20 баллов</b>. Десятое задание для тех, кто хотел поприменять java.util.concurrent (предупреждение: вам потребуется самостоятельно немного почитать про сеть, сокеты и т.п. )
 +
* [[Java_2013_HW10|Одиннадцатое задание]] срок сдачи 12 мая
 +
* [[Java 2013 CW2|Контрольная работа - 2]]
 
Присылать задачи нужно на почту <b>sergeynurk@gmail.com</b> с копией <b>anton.m.kuznetsov@gmail.com</b> и темой: <b>Java homework <фамилия> tasks 1,2,3...</b>
 
Присылать задачи нужно на почту <b>sergeynurk@gmail.com</b> с копией <b>anton.m.kuznetsov@gmail.com</b> и темой: <b>Java homework <фамилия> tasks 1,2,3...</b>
  
Строка 181: Строка 198:
 
}
 
}
 
</source>
 
</source>
 
==Контрольная работа. Условие задачи.==
 
Сегодня мы будем писать игру крестики-нолики на поле размером NxN, где для выигрыша необходимо поставить K в ряд.
 
Присутствующие классы:
 
 
Position - текущее состояние игрового поля. В игре крестики-нолики 1 - крестик, 2 - нолик, 0 - ничего нету. Метод toString должен выдавать состояние поля в виде таблицы чисел.
 
 
Например,
 
 
1100
 
 
0100
 
 
0222
 
 
0000
 
 
Player - ИИ игрока для какой-нибудь игры. Чтобы определить для какой именно есть метод getGameType возвращающий Class самой игры. getName - имя ИИ. move - делает 1 ход и возвращает НОВЫЙ Position (а не измененный старый)
 
 
XOPlayer - ИИ для игры XO.
 
 
Game - класс абстрактной игры принимающий в качестве параметров конструктора двух игроков. Если класс игры не совпадает и классом игры у Player должен порождаться RuntimeException. Game реализует интерфейс Iterable, что позволяет итерироваться по позициям возникающим в процессе игры. В Game необходимо добавить метод позволяющий определить победителя.
 
 
Создайте класс Tournament<T extends Game> implements Iterable<T>, который будет производить турнир среди различных ИИ для конкретной игры. В качестве параметра конструктора Tournament принимает следующее:
 
 
1) Каталог с class-файлами ИИ
 
 
2) Class<T> gameClass
 
 
3) Object[] - набор параметров конструктора соответствующего Game.
 
 
При этом должны быть загружены только те ИИ, которые соответствуют данной игре. Должен быть предусмотрен метод, который выдает результат турнира - таблицу вида
 
 
Вася Петя Коля
 
 
Вася  1      1      0
 
 
Петя  2      0      0
 
 
Коля  0      1      1
 
 
Число - количество побед при двух партиях (в первой ходит первым первый игрок, во второй - второй)
 
 
Проведите турнир для игры XO.
 
 
В данной работе не требуется написать эффективный ИИ. Задача правильно реализовать предложенную архитектуру (далеко не идеальную :) ). Тем не менее, за хорошо написанный ИИ будут добавляться баллы.
 
  
 
== Ссылки ==
 
== Ссылки ==

Текущая версия на 12:22, 3 июня 2013

Лектор - Кузнецов Антон

Практика - Нурк Сергей

Рейтинг

Текущий рейтинг

Условия получения зачета

Общие условия получения зачета - зачесть контрольную работу (для этого договориться с АМ о том, когда ее написать), сдать 9 лабораторных работ, устно побеседовать с преподавателем. Итоговая оценка будет ставиться исходя из количества набранных баллов и ваших ответов в устной беседе.

Примерное количество баллов

  1. на оценку удовлетворительно - 60
  2. на оценку хорошо - 70
  3. на оценку отлично - 80

Лекции

Задания

Присылать задачи нужно на почту sergeynurk@gmail.com с копией anton.m.kuznetsov@gmail.com и темой: Java homework <фамилия> tasks 1,2,3...

Вопросы можно задать по тому же почтовому адресу с темой Java question.

Рекомендуемая литература

  • "Thinking in Java", Bruce Eckel
  • "Effective Java", Joshua Bloch

Coding conventions

В отличие от C++, для Java есть общепринятые coding conventions от компании Sun.

В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.

Некоторые требования

Форма поставки кода

Задания должны присылаться в jar архивах. В архивы включаются только ваши исходники (.java файлы).

Для создания архивов используйте утилиту jar.

Каждая задача должна находиться в пакете ru.spbau.<ваша фамилия>.task<# задания>

В качестве точки входа должен использоваться класс с именем Main.

Можете складывать несколько заданий в один архив.

Javadoc

Ко всем классам, интерфейсам и public/protected полям и методам должен быть написан осмысленный javadoc на грамотном английском языке.

Javadoc должен быть валидным (в частности, содержать все required tags).

Настоятельно рекоммендуется использовать консольные или встроенные в IDE средства проверки валидности javadoc.

Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.

Exceptions

При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.

Распространенные недочеты:

  • Использование исключений для управления логикой программы
  • Оборачивание проверяемых исключений в непроверяемые
  • Подавление исключений
  • Отсутствие вывода читаемой полезной информации в блоках обработки ошибок
  • Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)
  • Перехват исключений слишком общeго типа

Общие замечания

  • Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.
  • Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.

FAQ

Q: Можно ли использовать finalize для закрытия открытых файлов?

A: Нет, нельзя. На лекциях обязательно будет разобрано почему.


Q: Нужно ли всегда использовать утилиту ant?

A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.


Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?

A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.

Примеры работы с "файловыми" исключениями

Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).

Можете использовать тот, который вам больше по душе.

	/**
	 * The way I always tried to use dealing with "file-reading" exceptions.
	 */
	public static void firstExample() {
		String filename = "filename"; 
		try {
			BufferedReader reader = new BufferedReader(new FileReader(filename));
			String line;
			try {
				while ((line = reader.readLine()) != null) {
					/*TODO something*/
					System.out.println(line);
				}
			} catch (IOException e) {
				System.err.println("Strange IOException happened during reading. Message: " + e.getMessage());
				e.printStackTrace();
			} finally {
				try {
					reader.close();
				} catch (IOException e) {
					System.err.println("Strange IOException happened during closing file. Message: " + e.getMessage());
					e.printStackTrace();
				}
			}
		} catch (FileNotFoundException e) {
			System.err.println("Couldn't find file: " + filename);
		}
	}

	/**
	 * The way to get rid of one level of try blocks. 
	 * Significantly reduces depth when dealing with several files. 
	 */
	public static void secondExample() {
		String filename = "filename"; 
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(filename));
			String line;
			while ((line = reader.readLine()) != null) {
				/*TODO something*/
				System.out.println(line);
			}
		} catch (FileNotFoundException e) {
			System.err.println("Couldn't find file: " + filename);
		} catch (IOException e) {
			System.err.println("Strange IOException happened during reading. Message: " + e.getMessage());
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					System.err.println("Strange IOException happened during closing file. Message: " + e.getMessage());
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * Brand new Java7 way of dealing with this example.
	 * Uses try-with-resources statement.
	 * For more information see: 
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.
	 */
	public static void thirdExample() {
		String filename = "filename"; 
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
			String line;
			while ((line = reader.readLine()) != null) {
				/*TODO something*/
				System.out.println(line);
			}
		} catch (FileNotFoundException e) {
			System.err.println("Couldn't find file: " + filename);
		} catch (IOException e) {
			System.err.println("Strange IOException happened. Message: " + e.getMessage());
			e.printStackTrace();
		} 
	}

Ссылки