Klasa ze statycznymi polami / funkcjami - Czy można inicjalizować?

0

Witam,

Chciałbym uzyskać informacje o "static" używanym w obrębie klasy.

  1. Jaka jest prawidłowa praktyka w posługiwaniu się klasami, które zawierają "static" ? Czy
    praktykuje się tworzenie klasy która zwiera część pól statycznych, a część zwykłych oraz tworzenie instancji takiej klasy?
  2. W jakich przypadkach powinno się stosować klasy, które są w pełni statyczne ?

Pozdrawiam

0

Na przykładzie c++

#include<iostream>
using namespace std;
static int statyczne(){
	static int i;
    i++;
	return i;
}

int zwykle(){
	int i;
    i++;
	return i;
}

int main(){
	/// WYWOŁANIE FUNKCJI STATYCZNEJ ZE ZMIENNĄ STATYCZNĄ DWA RAZY
	cout<<statyczne()<<endl; // ZWRÓCI 1
	cout<<statyczne()<<endl; //ZWRÓCI 2
	cout<<endl;
	/// WYWOŁANIE ZYWKŁEJ FUNKCJI ZE ZWYKŁĄ ZMIENNĄ
	cout<<zwykle()<<endl; // ZWRÓCI 1
	cout<<zwykle()<<endl; //ZWRÓCI 1
	cout<<endl;
	

}
 

Chodzi o to że zmienna zadeklarowana jako statyczna po wywołaniu funkcji zachowa swą pierwotną wartość pomiędzy kolejnymi wywołaniami funkcji.

0

Natomiast jeśli mamy elementy statyczne klasy to zeby sie do nich odnieść nie potrzebujmy tworzyć instancji klasy

klasa_statyczna::nazwa_metody();

0
Nadziany Wąż napisał(a):
  1. Jaka jest prawidłowa praktyka w posługiwaniu się klasami, które zawierają "static" ? Czy
    praktykuje się tworzenie klasy która zwiera część pól statycznych, a część zwykłych oraz tworzenie instancji takiej klasy?

Moim zdaniem oba podejścia mają te same wady, użycie static wprowadza pewien globalny stan który ciężko kontrolować i testować.

Nadziany Wąż napisał(a):
  1. W jakich przypadkach powinno się stosować klasy, które są w pełni statyczne ?

Myślę, że dobrym przykładem może być metoda wytwórcza, czy tam fabryka, czasem można spotkać się z taką implementacją:

class FancyService {
   private $repository;

   public function __construct(FancyRepository $repository) 
   {
     $this->repository = $repository;
   }
}

class FancyServiceFactory {
  public static function createInstance() : FancyService
  {
     $repository = new FancyRepository();

     return new FancyService($repository);
  }

$service = FancyServiceFactory::createInstance();

Choć spokojnie można zrealizować podobną fabrykę bez użycia czystej klasy statycznej.

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