Projektovanje softvera/K1P 2024

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

Popravni prvi kolokvijum 2024. godine održan je 1. decembra 2024. godine. Bile su dostupne prezentacije o svim projektnim obrascima, kao i Java dokumentacija. Vreme za izradu je bilo 120 minuta.

1. zadatak

Postavka

Posmatra se deo implementacije fajl sistema, u kojoj se fajl sistem posmatra kao stablo. Čvor fajl sistema može da se ispiše. Fajlovi predstavljaju čvorove koji su uvek listovi u stablu, i imaju svoje ime i sadržaj, oba predstavljena nizom znakova. Pri ispisivanju fajla ispisuje se njegovo ime.

Direktorijumi predstavljaju unutrašnje čvorove u stablu i mogu imati decu u vidu fajlova ili drugih direktorijuma. Pri ispisivanju direktorijuma ispisuje se njegovo ime, nakon čega se u sukcesivnim redovima ispisuju njegova deca sa dodatnim tabom indentacije.

Moguće je prijavljivanje na praćenje promena u direktorijumu. Svaki put kada se desi promena, svim prijavljenima se šalje poruka u vidu teksta, za sledeće konkretne situacije:

  1. Kada se doda fajl – “File added: {filename}”
  2. Kada se izbaci fajl – “File removed: {filename}”
  3. Kada se promeni sadržaj fajla – “File content changed – {filename}”

U ovom sistemu za sada postoji jedan tip posmatrača (kasnije mogu biti osmišljeni i dodati novi tipovi) – ObserverLogger, koji svaku promenu ispisuje na standardni izlaz.

Korišćenjem kombinacije projektnih obrazaca Sastav (Composite) i Posmatrač (Observer) potrebno je implementirati opisani deo sistema i navesti raspodelu uloga iz obrasca klasama u ovom rešenju; opis dati u tekstualnom fajlu z1.txt.

Napisati primer korišćenja date saradnje. Napraviti direktorijum u kojem se nalazi dva fajla. Instancirati jedan objekat klase ObserverLogger i prijaviti ga na praćenje napravljenog direktorijuma. Ispisati direktorijum, zatim dodati novi fajl u njega i ukloniti neki od početna dva. Izmeniti sadržaj jednog od preostalih fajlova, a zatim ispisati direktorijum. Početno stanje:

public interface FileSystemNode{
	
	public void write();
	
}

Rešenje

Saradnja

U ovom zadatku potrebno je koristiti uzorke Sastav i Posmatrač.

Sastav
Učesnici:
  • Komponenta (FileSystemNode)
  • Sastav (Directory)
  • List (File)
Posmatrač
Učesnici:
  • Posmatrač (Observer)
  • KonkretanPosmatrač (ObserverLogger)
  • KonkretanSubjekat (Directory)

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);
        this.notifyObservers("File added: "+child.name);
    }

    public void removeChild(FileSystemNode child) {
        this.children.remove(child);
        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", directory);
        File file2 = new File("myTestFile2", "content2", directory);
        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. zadatak

Ovaj zadatak nije rešen. Pomozite SI Wiki tako što ćete ga rešiti.

Postavka

Posmatra se deo implementacije prikazivanja notnog sistema na nekom uređaju koji ima mali memorijski kapacitet. Nota može imati vrednosti: cele note, polovine note i četvrtine note, pri čemu se note sa istim vrednostima crtaju na isti način nezavisno od toga gde se nalaze u notnom sistemu. Piano note su vizuelno manje i svetlije, a Forte note veće i tamnije.

Na uređaju se u svakom trenutku prikazuje samo jedan notni sistem, u kojem se obično nalazi veliki broj nota. Notni sistem se parametrizuje da koristi ili Piano ili Forte note, nakon čega se note dodaju redom, jedna po jedna, tako što se pri svakom dodavanju definiše koja je vrednost note (cela, polovina, četvrtina) i koja je njena solmizacija (do, re, mi, fa, sol, la, si).

Od solmizacije zavisi na kojoj će se visini nota nacrtati, a od redosleda ubacivanja zavisi na kojoj širini. Notni sistem može da se resetuje, pri čemu se brišu sve note koje su se nalazile u njemu, i tada može da se promeni parametrizacija nota na drugu vrstu.

Doraditi datu implementaciju sistema korišćenjem odgovarajućih projektnih obrazaca.

Navesti sve primene projektnih obrazaca u sistemu sa kratkim obrazloženjem u tekstualnom fajlu z2.txt (jedna do dve rečenice).

Rešenje