Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: Przekazywanie damych między klasami

Tworzę programik testowy i jak zwykle zaciąłem się na samym początku
są 3 klasy - każda klasa w osobnym pliku.
1)Gui - z założenia ma tam być tylko interfejs użytkownika (na razie ma tylko przekazywać trzy dane x, y, z)
2)Mechanika - klasa zawierająca dane oraz operacje na nich (na chwilę obecną ma przechowywać dane x i y oraz obliczyć z)
3) Start - klasa startująca cały program i tutaj tworzone mają być obiekty.

Zakładam, że program będzie mógł mieć więcej niż 1-2 klasy i chodzi o to, jak sterować przepływem danych.
Przesył danych między startem a mechaniką / gui nie stanowi problemu. Problem pojawia się pomiędzy gui a mechaniką. Jak można sobie z tym fantem poprawnie poradzić?

Z góry dziękuję za pomoc :)

klasa Start
package okna_test;

public class Start
{
public static void main(String[] args)
{
Mechanika mechanika=new Mechanika();
GUI gui=new GUI();

gui.wynik();
}
}


klasa Mechanika
 package okna_test;

public class Mechanika
{
private int x;
private int y;
private int z;

public Mechanika() //konstruktor
{
x=0;
y=0;
z=0;
}

public int getz() //getter
{
return z=x+y;
}

public void setx(int x) // setter
{
this.x=x;
}

public void sety(int y) //setter
{
this.y=y;
}
}


klasa GUI
package okna_test;

public class GUI
{
public int wynik()
{
mechanika.setx(10);
mechanika.sety(5);
return mechanika.getz();
}
}
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: Przekazywanie damych między klasami

Udało mi się znaleźć rozwiązanie przez użycie metody statycznej. Czy jest to odpowiednia droga, czy są "bardziej poprawne" sposoby?
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: Przekazywanie damych między klasami

sugeruję poznać interface Observer, class Observable
oraz wzorzec Observer/Obserwator.

konto usunięte

Temat: Przekazywanie damych między klasami

Generalnie to Model,View,Controller - model ma dane, odpowiada za ich przechowywanie, pozwala na odpytanie się o dane, controller obskakuje logikę, view - warstwa prezentacji. Skoro UI operuje na danych, to wywołuje jakąś metodę, może być `wynik`, cokolwiek. Wtedy kontrola przekazywana jest do kontrolera i on ma w sobie logikę co z tym zrobić. Np. może zapytać model o dane, przetworzyć, sprawdzić, czy wszystko jest ok, odesłać, zapisać...

No, ale zgadzam się, że wzorce projektowe dobrze byłoby poznać... Polecam Head first: "Design Paterns" https://helion.pl/ksiazki/head-first-design-patterns-ed... - najlepiej po angielsku. Co prawda nie jest to 100% gang of four, ale... bardzo, bardzo przystępnie przedstawia co to jest i po co. Do tego trzeba programowanie - strukturalne, obiektowe... Jakoś będzie.
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: Przekazywanie damych między klasami

Dziękuję bardzo za odpowiedź. Książka już zamówiona :)
Wzorców projektowych wcześniej nie dotykałem wcale. Ciekawe na ile zmieni to moje spojrzenie :)
Igor Janicki

Igor Janicki Software maker.
Java, Perl ...

Temat: Przekazywanie damych między klasami

ale póki co sugeruję sprawdzić online w/w klasy oraz zagadnienie "dependency injection"Ten post został edytowany przez Autora dnia 06.11.17 o godzinie 14:05
Marcin Barańczak

Marcin Barańczak Programista - tester
automatyzujący

Temat: Przekazywanie damych między klasami

Dziękuję za podpowiedź :)
Wojciech Obłąk

Wojciech Obłąk Programista, Asseco
Poland

Temat: Przekazywanie damych między klasami

Ja bym to tak przerobił:


import static org.junit.Assert.*;

import org.junit.Test;

public class testGui {

@Test
public void testGetResult() {
// Given:
IMechanika m = new Mechanika();

// When:
Gui gui = new Gui(m);

// Then:
assertEquals(15, gui.getResult());
}

}


public interface IMechanika {
public void setX(int x);
public void setY(int y);
public int getZ();
}


public class Mechanika implements IMechanika {
private int x = 0;
private int y = 0;
private int z = 0;

public Mechanika(int x, int y) {
this.x = x;
this.y = y;
updateZ();
}

public Mechanika() {

}

private void updateZ() {
this.z = x + y;
}

@Override
public int getZ() {
return z;
}

@Override
public void setX(int x) {
this.x = x;
updateZ();
}

@Override
public void setY(int y) {
this.y = y;
updateZ();
}
}


public class Gui { // mother
IMechanika engine;

public Gui(IMechanika m){
this.engine = m;
}

public int getResult(){
engine.setX(10);
engine.setY(5);
return engine.getZ();
}
}


Pytanie czy nie lepiej podawanie argumentów `x` i `y` zrobić w metodzie `getZ()` i nazwać ją np. `calculateZ`.Ten post został edytowany przez Autora dnia 08.11.17 o godzinie 11:50
Marek Kocemba

Marek Kocemba Programista Java

Temat: Przekazywanie damych między klasami

Wtrącę swoje 5 groszy do Twojej klasy Mechanika

Polecam zapoznać się z podstawami programowania.

public Mechanika() //konstruktor
{
x=0;
y=0;
z=0;
}

Po tym wiem już że nie masz pojęcia o tym jak konstruktor domyślny działa, składowe klasowe są automatycznie inicjowane wartościami: 0 dla int , false dla booleanów oraz null dla obiektów

public int getz() //getter
{
return z=x+y;
}

Tutaj złamałeś zasadę pojedynczej odpowiedzialności, zwracasz "z" jednocześnie przeprowadzając operacje arytmetyczną. To tak jakbyś miał metode pobierzObiad() a gdy przyglądasz się metodzie to jesteś zaskoczony bo
public Obiad pobierzObiad()
{
przygotujKolacje();
return obiad;
}
Nie spodziewasz się tego że metoda pobierzObiad przygotowywuje też kolację. Tak samo tutaj albo stwórz metodę getSumXAndY() a;bo ustawiaj Z jakąs inną metodą i w getZ zwracaj gotową zTen post został edytowany przez Autora dnia 22.01.18 o godzinie 23:30

konto usunięte

Temat: Przekazywanie damych między klasami

Marek K.:

Jak ktoś robi 3 klasy - Model,View,Controler, po czym stwierdza, że utknął zaraz na początku, to raczej należy się skupić na pomocy i zachęcaniu, a nie rypaniu, za każdy błąd. W takim wypadku można wyjść na kogoś, kto ma jakieś problemy a tutaj jest, żeby odreagować... ;)



Wyślij zaproszenie do