Programowanie obiektowe w C++. Czy konieczne?

0

Witam mam pytanie odnośnie programowania w C++ : Nie używam w c++ Class bo nie wygodnie mi tak używam za to Funkcji i moje pytanie to czy to jest dobre> czy nie będzie później problemów co do pracy? czy lepiej zacząć używać Class?

0

Programowanie obiektowe to część C++ oraz całość C# czy Javy. Jak chcesz bez znajomości tego pracować przy większych projektach?

0

Na początku używanie samych funkcji może być łatwiejsze. Dopiero później, gdy zaczynasz programować zespołowo, klasy mogą okazać się niezbędne.
Wg. mnie lepiej jest iść małymi kroczkami w stronę programowania obiektowego ( używanie klas itd. ) niż tkwić w samych funkcjach.
Są takie języki programowania, m.in. Java, gdzie wszystko jest jedną wielką klasą. Wtedy takie rzeczy trzeba po prostu umieć.
Pozdrawiam,
WiedźMAC

0

Można programować bez używania obiektowości, pytanie tylko czy faktycznie się tego chce? To jest po prostu bardziej niskopoziomowe programowanie. Znacznie łatwiej napisać coś korzystając z pewnego poziomu abstrakcji, co nie znaczy ze nie da się tego napisać w asemblerze czy w C (tylko ze w tych dwóch ostatnich będzie po prostu trudniej).
@autor klas nie używasz bo ich nie umiesz i nie rozumiesz, a nie dlatego ze ci "nie wygodnie", nie oszukujmy się...

0

Nauka programowania obiektowego na początku trochę boli, potem jednak nie chce się programować inaczej.

0
Shalom napisał(a)

Można programować bez używania obiektowości, pytanie tylko czy faktycznie się tego chce? To jest po prostu bardziej niskopoziomowe programowanie. Znacznie łatwiej napisać coś korzystając z pewnego poziomu abstrakcji, co nie znaczy ze nie da się tego napisać w asemblerze czy w C (tylko ze w tych dwóch ostatnich będzie po prostu trudniej).
@autor klas nie używasz bo ich nie umiesz i nie rozumiesz, a nie dlatego ze ci "nie wygodnie", nie oszukujmy się...

Jednak nie wygodnie mi z JAVY przeszedłem na c++ wiem jak używać Class ale w c++ jest to nie wygodne teraz dla mnie przyzwyczaiłem się do pisania Funkcjami i dlatego się pytam czy lepiej odzwyczaić się od tego?

0

Napisanie czegoś większego bez OOP będzie ciężkie(przynajmniej w C++). Poza tym jednak w pracy OOP jest raczej konieczne. Nie sądzę, żeby nagle cały zespół dostosowywał się do Twojego sposobu pisania.

0

Jeszcze się nie da, C++0x ma to zmienić.
Hmm… jeśli gcc już to ma, i Visual C++ to ma, a nie jest jeszcze oficjalnie zatwierdzony standard, to się da czy się nie da?

czy nie będzie później problemów co do pracy?
Tego nigdy nie wiadomo. Na pewno się naucz obiektowości, nawet jeśli na własny użytek wolisz pisać strukturalnie.

0

Ok Dzięki. Mam tylko jeszcze jedno pytanie luknijcie czy tak mam pisać Klasy http://wklej.org/id/478179/ taki mały kalkulator z wykorzystaniem klas.

0

Nie. nie tak. Ta klasa nie ma sensu. Pomijam już fakt, że nawet nie ma sensownej nazwy. Tak jak ktoś wyżej napisał: nie używasz klas bo ich nie rozumiesz. Masz sobie ułatwiać pisanie programów za pomocą programowania obiektowego, a nie utrudniać. Czy coś sobie ułatwiłeś? Nie.

0

@anonim: Twoja klasa zajmuje się wykonywaniem obliczeń oraz obsługą wejścia oraz wyjścia. Zasada pojedyńczej odpowiedzialności(SRP) mówi, że każda klasa powinna odpowiadać za jedno zadanie. Twoja odpowiada za trzy, no może za dwa, jeśli obsługę I/O potraktujemy jako jedną odpowiedzialność. W każdym razie spróbuj napisać tą klasę tak, aby zajmowała się tylko wykonywaniem obliczeń, a na pewno będzie Ci łatwiej. Do obsługi I/O nie musisz już pisać oddzielnej klasy, ponieważ do tego służą chociażby strumienie. Poczytaj sobie o hermetyzacji, a zrozumiesz o co @Carlos Spicy-Weener się przyczepił. Ukrywając implementację ułatwiasz sobie zapanowanie nad projektem oraz ograniczasz zależności między poszczególnymi częściami kodu.

0

Napiszę to jeszcze raz. Wiem że źle że wszystko jest Public: Ale to tylko tak na przykład dałem , wiem co to hermetyzacja programowałem w JAVA a tam wszystko to klasy tylko ze w C++ inaczej się pisze Klasy.

0
Anonim napisał(a)

... w C++ inaczej się pisze Klasy.

Bzdura, zasady programowania obiektowego są te same tylko składnia trochę inna w różnych językach.

0

Obiektowość w C++ jest prymitywniejsza. Jedyną zaletą jaką ja widzę w obiektowym C++ to fakt, że nie muszę do każdej metody z obszaru public dopisywać specyfikatora dostępu, i analogicznie do metod z przestrzeni protected i private. Chociaż założę się, że zaraz mnie tu ktoś zjedzie za takie herezje, twierdząc że dopisywanie public czy private do każdej metody ma głębszy sens.

Rozbijanie problemu na klasy ma sens przy nieco bardziej rozbudowanych problemach, wtedy podczas debugowania nie pałęta Ci się przed oczami kod którego nie potrzebujesz widzieć. Chociaż ja osobiście rozbijam sobie kod na klasy nawet w programiku na 1k wierszy. Po prostu mi tak wygodniej i czytelniej.

0
several napisał(a)

Obiektowość w C++ jest prymitywniejsza.

Nom, ale takie są uroki dziedziczenia wielokrotnego i wirtualnego.

0

Poprawiłem kod programu który wkleiłem wcześniej teraz powinno być dobrze jeżeli nie znowu poprawie;)

Link do źródła http://wklej.org/id/478665/

Wywołanie reset(); i Wyczysc(); liczę jako jedno :)

0

Mam kilka pytań:
-Jaki jest cel stosowania kasy Kalkulator,
-dlaczego zamiast zwykłej funkcji stosujesz coś takiego: Pomocnicza.Wyczysc.

Poza tym dublujesz kod, przykład: wyświetlanie menu w każdej metodzie.

Jeżeli chcesz się użyć klas, to skopiuj pomysł Koziołka (konfiguracja dostępnych usług/polecen w kodzie)
Jak stworzyć menu w konsoli

0
nuvistor napisał(a)

Mam kilka pytań:
-Jaki jest cel stosowania kasy Kalkulator,
-dlaczego zamiast zwykłej funkcji stosujesz coś takiego: Pomocnicza.Wyczysc.

Poza tym dublujesz kod, przykład: wyświetlanie menu w każdej metodzie.

Jeżeli chcesz się użyć klas, to skopiuj pomysł Koziołka (konfiguracja dostępnych usług/polecen w kodzie)
Jak stworzyć menu w konsoli

To tak dla przykładu czy dobrze tak piszę klasy. Bo miałem to napisać w Klasach i każda klasa miała wykonywać jedną rzecz wraz z Strumieniami.

0

To taki trochę nietrafiony przykład, bo to akurat rzeczywiście można napisać w samym mainie. Poza tym, dlaczego tryb, i, liczby, n i wynik przechowujesz jako pola klasy, skoro i tak musisz je wszystkie wyzerować w każdej metodzie? I czy w c++ nie istnieje void i switch?

0
  1. Wszystkie metody zwracają 0. Czemu to ma służyć?
  2. Jaki sens mają te wszystkie pola w klasie Kalkulator? Przecież one mają charakter pomocniczy.
  3. Po usunięcie wszystkich pól obiekty nie będą miały stanu (nawet "śmieciowego", jak teraz). W takim przypadku tworzenie obiektów takiej klasy mija się troszeczkę z celem. Już lepiej przerobić te metody na statyczne. Ewentualnie zamiast klasy wykorzystać przestrzenie nazw.
  4. Klasa pomocnicza jest też bez sensu.

Lepiej napisz coś sensowniejszego. Napisz jakąś klasę, która opakowuje tablicę i pozwala wykonywać na niej takie czynności jak pobranie wartości największej/najmniejsze, sumowanie, sortowanie itp. Wtedy prędzej dostrzeżesz zalety programowania obiektowego.

0

Czekajcie bo każdy gada mi coś innego . Miałem napisać tak by Klasa Kalkulator wykonywała tylko jedynie obliczenia. Wiem że można to zrobić w mainie ale to tak na przykład w klasach. Ja tylko chcę byście mi powiedzieli czy dobrze je piszę. To tylko tak na przykład dałem ten kod.

Więc moje pytanie czy dobrze je piszę?

0

Podobno początkujący w pisaniu obiektowym piszą kod proceduralny, tylko zamknięty w obiekty.
Ale prawdziwy problem tutaj polega na tym że kalkulator się niezbyt nadaje na przykład programowania obiektowego - jest to czysto proceduralny 'byt' i próba zamknięcia go w obiekcie nic ciekawego nie da. Chociażby z tego względu że kalkulator nie przechowuje żadnego stanu.

Musi to być akurat kalkulator?

0

Miałem napisać tak by Klasa Kalkulator wykonywała tylko jedynie obliczenia

To niech wykonuje tylko obliczenia, a całą obsługę interfejsu użytkownika z niego usuń.

Więc moje pytanie czy dobrze je piszę?

Co rozumiesz przez stwierdzenie "dobrze je piszę"?
W kilku ostatnich postach, masz listę rzeczy dyskusyjnych.

Wracając do mojego poprzedniego posta, w odpowiedzi napisałeś:

Bo miałem to napisać w Klasach i każda klasa miała wykonywać jedną rzecz wraz z Strumieniami.

To co zaproponowałem, rozbija twój kalkulator na kilka klas i każda z nich wykonuje jedną rzecz (np. operacje dodawanie, odejmowania).

0
nuvistor napisał(a)

Miałem napisać tak by Klasa Kalkulator wykonywała tylko jedynie obliczenia

To niech wykonuje tylko obliczenia, a całą obsługę interfejsu użytkownika z niego usuń.

Więc moje pytanie czy dobrze je piszę?

Co rozumiesz przez stwierdzenie "dobrze je piszę"?
W kilku ostatnich postach, masz listę rzeczy dyskusyjnych.

Wracając do mojego poprzedniego posta, w odpowiedzi napisałeś:

Bo miałem to napisać w Klasach i każda klasa miała wykonywać jedną rzecz wraz z Strumieniami.

To co zaproponowałem, rozbija twój kalkulator na kilka klas i każda z nich wykonuje jedną rzecz (np. operacje dodawanie, odejmowania).

Źle zrozumiałem myślałem że chodzi ci o system("cls"); :D co właśnie dziwne mi się wydawało że to jest to 3; Więc każda klasa ma wykonywać jedną rzecz czyli jedna klasa np. na 1:dodawania 2:odejmowania itd przy zachowaniu Hermetyzacji(enkapsulacji); Dlatego wybrałem Kalkulator bo nic innego nie przyszło mi na myśl;

Więc tak klasy pisać tak by każda wykonywała jedno; 2: Pamiętać o Hermetyzacji ; Czy zapomniałem jeszcze czegoś?

0

Tak. Najważniejszego. Nauczyć się modelowania obiektowego. Bo akurat "klasa" odpowiedzialna za dodawanie jest lekko dziwnym wytworem. Jaki obiekt rzeczywisty z dziedziny problemu ta klasa reprezentuje?

0
Shalom napisał(a)

Tak. Najważniejszego. Nauczyć się modelowania obiektowego. Bo akurat "klasa" odpowiedzialna za dodawanie jest lekko dziwnym wytworem. Jaki obiekt rzeczywisty z dziedziny problemu ta klasa reprezentuje?

Czy klasa może reprezentować tylko rzeczywisty obiekt?

Ja przyjąłem że klasy reprezentują operacje (np.dodawanie) wykonywane przez kalkulator.
Możesz zaproponować coś mniej dziwnego?

0

Klasy mogą reprezentować operacje (patrz: wzorzec projektowy Command, wzorzec projektowy ActiveObject i im podobne) ale trzeba mieć ku temu powody i rozumieć co się właściwie robi :)

0

Trochę się z tym namęczyłem, w każdym razie działa.

Żebyśmy się dobrze zrozumieli, to NIE JEST dobre rozwiązanie kalkulatora i nikt normalny czegoś takiego nie pisze (w sensie w normalnym projekcie). To raczej pokaz programowania "prawdziwie" obiektowego.

Polimorfia, dziedziczenie, wzorzec command. Enjoy :P

#include <iostream>
#include <list>

using namespace std;

class operation
{
	public:
		virtual float perform(float num1, float num2) = 0;
};

class calculator
{
	private:
		operation *op;
		list<float> *numbers;

	public:
		calculator()
		{
			numbers = new list<float>();
		}
		
		void setOperation(operation *op)
		{
			this->op = op;
		}
		
		void addNumber(float num)
		{
			numbers->push_back(num);
		}
		
		float evaluate()
		{
			list<float>::iterator it;
			float result = *numbers->begin();
			for( it=++numbers->begin(); it!=numbers->end(); ++it )
			{
				result = op->perform(result, *it);
			}
			
			return result;
		}
		
		void clear()
		{
			numbers = new list<float>();
		}
};

class addition : public operation
{
	public:
		virtual float perform(float num1, float num2)
		{
			return num1 + num2;
		}
};

class substraction : public operation
{
	public:
		virtual float perform(float num1, float num2)
		{
			return num1 - num2;
		}
};

int main()
{
	calculator *calc = new calculator();
	
	calc->setOperation(new addition());
	calc->addNumber(1);
	calc->addNumber(2);
	calc->addNumber(3);
	
	cout << "wynik wynosi: ";
	cout << calc->evaluate();
	cout << endl;
	
	calc->clear();
	
	calc->setOperation(new substraction());
	calc->addNumber(5);
	calc->addNumber(3);
	
	cout << "a teraz wynik wynosi: ";
	cout << calc->evaluate();
	cout << endl;
}
0

Dzięki;) Bardzo mi pomogliście;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1