Sdílené třídy

Automaticky přeloženo z Deepl

Chcete zjednodušený způsob používání sdílených objektů, který by dodržoval klasickou syntaxi objektů a v případě potřeby automaticky volal use/end use?

Připoutejte se, přicházejí sdílené třídy!

Vytváření a správa sdílených tříd

Ve verzi 4D 20 R5 jsme přidali nový koncept: Sdílené třídy.

Sdílené třídy lze použít pouze k vytváření sdílených objektů a jako takové zjednodušují jejich používání. Chcete-li vytvořit sdílenou třídu, stačí do jejího konstruktoru přidat klíčové slovo shared:

//class SharedClass

shared Class constructor()

Sdílené třídy nelze použít k vytváření standardních objektů: pokaždé, když zavoláte funkci new() pro vytvoření nového objektu této třídy, bude to sdílený objekt.

Rozšíření na funkce třídy

Klíčové slovo shared lze použít také u funkcí třídy, což znamená, že tato funkce modifikuje objekt. Uvnitř funkce není třeba volat use a end use, protože jsou automaticky volány při volání a ukončení funkce. To samozřejmě platí i pro konstruktor singletonu.

shared Function myFunction()

This.attribute:="whatever"

Samozřejmě byste měli dávat pozor při používání klíčového slova shared u funkcí, které ho nepotřebují, abyste předešli zablokování jiných procesů, které se snaží objekt použít.

Správné používání sdílených tříd a funkcí by vám mělo umožnit manipulovat se sdílenými objekty, jako by to byly normální objekty, což zjednoduší váš kód.

Úvahy o dědičnosti

Poslední bod, na který je třeba si dát pozor, je, že nesdílené třídy mohou dědit ze sdílených tříd, ale sdílené třídy nemohou dědit z nesdílených tříd. Naplánujte si tedy svůj objektový model podle toho.

Příklad

Řekněme, že musíte provést dlouhý výpočet a raději použijete worker, abyste se vyhnuli blokování důležitých procesů. Je však zřejmé, že v určitém okamžiku potřebujete získat výsledek výpočtu. Použijme tuto třídu CalculationResult:

// class CalculationResult

shared Class constructor()
	
  This.isFinished:=False
	
Function makeCalculation()

  ...
  This.finished:=True
	
shared Function set finished($finished : Boolean)
	
  This.isFinished:=$finished
	
shared Function get finished()->$finished : Boolean
	
  $finished:=This.isFinished

Chcete-li ji použít, stačí provést:

$calculation:=cs.CalculationResult.new()
CALL WORKER("AnyWorker"; Formula($calculation.makeCalculation()))

While (Not($calculation.isFinished))
  //Code that will be executed while the calculation is in progress
End while 

Doufám, že vám sdílené třídy pomohou používat sdílené objekty v celé aplikaci. Pokud máte nějaké dotazy, neváhejte s nimi přijít do fóra 4D.

Nicolas Brachfogel
• Product Owner & Senior Developer • Nicolas Brachfogel nastoupil do 4D v roce 2017 jako senior vývojář (4D server a sítě). Jako Product Owner, který řídí vydání Apple Silicon, má na starosti psaní uživatelských příběhů a jejich převod do funkčních specifikací a také zajišťuje, aby implementace funkcí vyhovovaly potřebám zákazníků. Nicolas, absolvent Institut Supérieur d'Informatique Appliquée (INSIA), začal svou kariéru jako softwarový vývojář v roce 2001. Po několika letech kódování v Javě a C++ se specializoval na vývoj klient-server pro společnosti zabývající se videohrami. Jako serverový vývojář/architekt úspěšně pracoval na serverových architekturách mnoha her (Dofus Arena, Drakerz, Trivial Pursuit Go!).