İşlemler

Sonucun Okunması

Bir veri tutucusuna “offer” ettiğiniz her şey için, ‘’offer’’ yöntemi bir :javadoc:’DataTrans actionResult’ üretecektir. Bu nesne aşağıdakileri içerecektir:

Tür

:javadoc:’DataTransactionResult.Type’ işlemin başarıyla tamamlandığını ya da başarısızsa neden başarısız olduğunu gösterir.

‘’UNDEFINED’’

İşlem için açık bir sonuç yok ise bir şeylerin ters gittiğini gösteriyor

‘’SUCCESS’’

İşlem başarıyla tamamlandı

‘’FAILURE’’

İşlem beklenen nedenlerden dolayı başarısız oldu (örn. Uyumsuz veriler)

‘’ERROR’’

İşlem beklenmedik nedenlerle başarısız oldu

‘’CANCELLED’’

Etkinlik bu işlem için iptal edildi

Etkilenen veri

Sonuç ayrıca, işlemde yer alan verileri temsil eden değer konteynerleri içeren birkaç değiştirilemez liste sunar.

‘’getSuccessfulData()’’

başarıyla kurulmuş olan tüm verileri içerir

‘’getReplacedData()’’

tüm başarıyla ayarlanıp değiştirilen verileri içerir

‘’getRejectedData()’’

kurulamamış olan tüm verileri içerir

Örnekler

Bir Oyuncu İyileştiriliyor

Şüphesiz: :doc:’keys’ sayfasındaki örneği hatırlarsınız. O yoldan iyileşen yarım kalbe (1 sağlığa eşit) sahip olan bir oyuncu düşünün. Bu durumda ‘’DataTransactionResult’’ şöyle görünür:

  • ‘’getType()’’ ‘’SUCCESS’’ dönecektir

  • ‘’RejectedData()’’ almak boş bir liste olur

  • ‘’getReplacedData()’’ 1.0 değerinde ‘’Keys.HEALTH’’ tuşu için bir değer konteyneri içerir

  • ‘’getSuccessfulData()’’ 20.0 değerine sahip “Keys.HEALTH” tuşu için bir değer konteyneri içermelidir

Bunun yerine, şifreleme örneğini :doc:’datamanipulators’ sayfasından kullansaydık nasıl farklı olurdu? Yukarıdaki sonuçlara ek olarak :javadoc:’HealthData’ veri manipülatörü hem güncel hem de maksimum sağlık için değerler içerdiğinden, hem ‘’getReplacedData()’’ listesi ve ‘’getSuccessfulData()’’ listesi, bir daha: “Keys.MAX_HEALTH” tuşu için 20.0 değerli bir konteynera sahip olur.

HealthData’yı bir blok taşına teklif etme

Şimdi yukarıda bahsedilen örnekler, uyumsuz verileri sunmaya çalışmak yerine sessizce başarısız olacak şekilde kodlanmıştır. Fakat (tamamen iyileşmiş) bir oyuncunun ‘’HealthData’’ aldığımızı ve şu anda üzerinde durduğu blok taşın :javadoc:’Location’ alanına sunmaya çalıştığımızı düşünün. Bunu “Location” da bir veri sahibi olduğu için yapabiliriz. Ve eğer bunu yaparsak, bize şöyle bir ‘’DataTransactionResult’’ ile ödül verecektir:

  • ‘’getType()’’ ‘’FAILURE’’ döndürür

  • ‘’Get Rejected Data()’’ her biri 20.0’lık bir değere sahip “HEALTH” ve “MAX_HEALTH” tuşları için iki tane değer konteyneri içermelidir

  • ‘’getReplacedData()’’ ve ‘’getSuccessfulData()’’ almak boş liste oluşturur

İşlemler geri veriliyor

Bir işlem sonucuyla ilgili her şey değişmez olduğundan, veri değişiklikleri belgelemek için kullanılabilir. Ayrıca belgelerdeki değişikliklerin geri alınmasına da izin verir. Bunun için bir işlem sonucunu veri sahibinin ‘’undo()’’ yöntemine basitçe geçer. Bazı veri önerileri kısmen başarılı olabilir, çünkü bir veya daha fazla değer veri sahibine başarıyla yazılır, henüz bir değer daha kabul edilemez. Kısmi başarıları geri almak isteyebilirsiniz.

Code Example: Reverting a transaction

import org.spongepowered.api.data.DataHolder;
import org.spongepowered.api.data.DataTransactionResult;
import org.spongepowered.api.data.manipulator.DataManipulator;

public void safeOffer(DataHolder target, DataManipulator data) {
    DataTransactionResult result = target.offer(data);
    if (result.getType() != DataTransactionResult.Type.SUCCESS) {
        target.undo(result);
    }
}