Пројектовање софтвера/К1П 2024
Поправни први колоквијум 2024. године одржан је 1. децембра 2024. године. Биле су доступне презентације о свим пројектним обрасцима, као и Java документација. Време за израду је било 120 минута.
1. задатак
Поставка
Посматра се део имплементације фајл система, у којој се фајл систем посматра као стабло. Чвор фајл система може да се испише. Фајлови представљају чворове који су увек листови у стаблу, и имају своје име и садржај, оба представљена низом знакова. При исписивању фајла исписује се његово име.
Директоријуми представљају унутрашње чворове у стаблу и могу имати децу у виду фајлова или других директоријума. При исписивању директоријума исписује се његово име, након чега се у сукцесивним редовима исписују његова деца са додатним табом индентације.
Могуће је пријављивање на праћење промена у директоријуму. Сваки пут када се деси промена, свим пријављенима се шаље порука у виду текста, за следеће конкретне ситуације:
- Када се дода фајл – “File added: {filename}”
- Када се избаци фајл – “File removed: {filename}”
- Када се промени садржај фајла – “File content changed – {filename}”
У овом систему за сада постоји један тип посматрача (касније могу бити осмишљени и додати нови типови) – ObserverLogger, који сваку промену исписује на стандардни излаз.
Коришћењем комбинације пројектних образаца Састав (Composite) и Посматрач (Observer) потребно је имплементирати описани део система и навести расподелу улога из обрасца класама у овом решењу; опис дати у текстуалном фајлу z1.txt.
Написати пример коришћења дате сарадње. Направити директоријум у којем се налази два фајла. Инстанцирати један објекат класе ObserverLogger и пријавити га на праћење направљеног директоријума. Исписати директоријум, затим додати нови фајл у њега и уклонити неки од почетна два. Изменити садржај једног од преосталих фајлова, а затим исписати директоријум. Почетно стање:
public interface FileSystemNode{
public void write();
}
Решење
Сарадња
У овом задатку потребно је користити узорке Састав и Посматрач.
- Састав
- Учесници:
- Компонента (FileSystemNode)
- Састав (Directory)
- Лист (File)
- Посматрач
- Учесници:
- Посматрач (Observer)
- КонкретанПосматрач (ObserverLogger)
- КонкретанСубјекат (Directory)
- Класа ObserverLogger би такође могла бити Уникат, али се текстом задатка то не сугерише.
- Фајл може настати као лебдећи (наставо и отворен у програму за уређивање текста попут програма Word) и да још нема директоријум. То је логика иза дозвољавања да родитељ буде null.
FileSystemNode.java
public abstract class FileSystemNode {
protected String name;
protected Directory parent;
public FileSystemNode(String name) {
this.name = name;
this.parent = null;
}
public abstract void write();
protected abstract void write(String indent);
public void setParent(Directory parent) {
this.parent = parent;
}
}
File.java
public class File extends FileSystemNode {
private String fileContent;
public File(String name, String content) {
super(name);
this.fileContent = content;
}
@Override
protected void write(String indent) {
System.out.println(indent+this.name);
}
@Override
public void write() {
System.out.println(this.name);
}
public void changeContent(String content){
this.fileContent = content;
if(this.parent != null) {
this.parent.fileChanged(this);
}
}
}
Directory.java
import java.util.ArrayList;
import java.util.List;
public class Directory extends FileSystemNode {
public Directory(String name) {
super(name);
}
private List<FileSystemNode> children = new ArrayList<>();
private List<Observer> observers = new ArrayList<>();
@Override
protected void write(String indent) {
System.out.println(indent+this.name);
for(FileSystemNode child : this.children) {
child.write(indent+"\t");
}
}
@Override
public void write() {
System.out.println(this.name);
for(FileSystemNode child : this.children) {
child.write("\t");
}
}
public void addChild(FileSystemNode child) {
this.children.add(child);
child.setParent(this);
if (child instanceof File) {
this.notifyObservers("File added: " + child.name);
}
}
public void removeChild(FileSystemNode child) {
this.children.remove(child);
child.setParent(null);
if (child instanceof File) {
this.notifyObservers("File removed - " + child.name);
}
}
public FileSystemNode getChild(int index) {
return this.children.get(index);
}
public void subscribe(Observer observer) {
observers.add(observer);
}
public void unsubscribe(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for(Observer observer : observers) {
observer.update(message);
}
}
public void fileChanged(FileSystemNode node) {
this.notifyObservers("File content changed – "+node.name);
}
}
Observer.java
public interface Observer{
public void update(String message);
}
ObserverLogger.java
public class ObserverLogger implements Observer{
public ObserverLogger() {
}
@Override
public void update(String message) {
System.out.println(message);
}
}
Main.java
public class Main {
public static void main(String[] args) {
Directory directory = new Directory("myDir1");
File file1 = new File("myTestFile1", "content1");
File file2 = new File("myTestFile2", "content2");
directory.addChild(file1);
directory.addChild(file2);
ObserverLogger og = new ObserverLogger();
directory.subscribe(og);
directory.write();
directory.removeChild(file2);
file1.changeContent("newContent1");
directory.write();
Directory subDir = new Directory("myDir2");
subDir.addChild(file2);
directory.addChild(subDir);
directory.write();
}
}
2. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
Посматра се део имплементације приказивања нотног система на неком уређају који има мали меморијски капацитет. Нота може имати вредности: целе ноте, половине ноте и четвртине ноте, при чему се ноте са истим вредностима цртају на исти начин независно од тога где се налазе у нотном систему. Piano ноте су визуелно мање и светлије, а Forte ноте веће и тамније.
На уређају се у сваком тренутку приказује само један нотни систем, у којем се обично налази велики број нота. Нотни систем се параметризује да користи или Piano или Forte ноте, након чега се ноте додају редом, једна по једна, тако што се при сваком додавању дефинише која је вредност ноте (цела, половина, четвртина) и која је њена солмизација (до, ре, ми, фа, сол, ла, си).
Од солмизације зависи на којој ће се висини нота нацртати, а од редоследа убацивања зависи на којој ширини. Нотни систем може да се ресетује, при чему се бришу све ноте које су се налазиле у њему, и тада може да се промени параметризација нота на другу врсту.
Дорадити дату имплементацију система коришћењем одговарајућих пројектних образаца.
Навести све примене пројектних образаца у систему са кратким образложењем у текстуалном фајлу z2.txt (једна до две реченице).