Özel Veri Türlerinin Oluşturulması

Widget - Araçlar, farklı veri türlerini kontrol etmemizi ve görselleştirmemize olanak tanımaktadır. Bu veriler tamsayılar ve çiftler hatta Java Nesneleri olabilir. Bu tür verileri araç kullanarak görüntülemek için, verilere özel bir kapsayıcı sınıf oluşturmak faydalı olacaktır. Araç doubles, arrays veya string gibi tek alanlı veri türlerini işleyecekse kendi Data Class - Veri Sınıfınızı oluşturmanız gerekmemektedir.

Veri Sınıfının Oluşturulması

Bu örnekte 2D Point - 2 boyutta bir nokta ile bu noktanın x ve y koordinatları için kişisel bir veri türü oluşturacağız. Bu sınıfı oluşturmak için, veri türü sınıfı ComplexData soyut sınıfını genişletmelidir. Ayrıca kişisel veri sınıfınız, aşağıdaki @Override ek açıklamasında da belirtildiği üzere, temsil edilen veriyi basit bir haritaya döndüren asMap() metodunu gerçekleştirmeniz gerekmektedir:

import edu.wpi.first.shuffleboard.api.data.ComplexData;
import java.util.Map;
public class MyPoint2D extends ComplexData<MyPoint2D> {
   private final double x;
   private final double y;
   //Constructor should take all the different fields needed and assign them their corresponding instance variables.
   public MyPoint2D(double x, double y) {
      this.x = x;
      this.y = y;
   }
   @Override
   public Map<String, Object> asMap() {
      return Map.of("x", x, "y", y);
   }
}

Alanları eşleştiğinde farklı nesnelerin eşit sayılmasını sağlamak için varsayılan equals ve hashcode metodlarını geçersiz kılmak iyi bir uygulama olacaktır. asMap() metodu, ilgili oldukları NetworkTables girişine eşlenecekleri için temsil edilen verileri basit birer Map object - Harita nesnesine döndürmelidir. Bu durumda noktayı X ve Y koordinatları şeklinde temsil edebilir ve bu koordinatları içeren bir Map döndürebiliriz.

import edu.wpi.first.shuffleboard.api.data.ComplexData;
import java.util.Map;
public final class MyPoint2D extends ComplexData<MyPoint2D> {
   private final double x;
   private final double y;
   // Constructor should take all the different fields needed and assign them to their corresponding instance variables.
   public Point(double x, double y) {
      this.x = x;
      this.y = y;
   }
   @Override
   public Map<String, Object> asMap() {
      return Map.of("x", this.x, "y", this.y);
   }
 }

Alanları ve örnek değişkenlerine erişim sağlamak veya değişkenleri düzenlemek için başka yöntemler eklenebilmekte, ancak kaynak veri nesnelerinin değiştirilmesini önlemek için bu sınıfları değişmez yapmak iyi bir uygulama olacaktır. Bunun yerine, mevcut nesneyi değiştirmek yerine yeni bir kopya nesnesi oluşturabilirsiniz. Örneğin, noktamızın y koordinatını değiştirmek istersek, aşağıdaki yöntemi tanımlayabiliriz:

public MyPoint2D withY(double newY) {
   return new MyPoint2D(this.x, newY);
}

Bu, yeni bir MyPoint2D nesnesi oluşturmakta ve onu yeni y koordinatı ile döndürmektedir. Aynı işlem x koordinatını değiştirmek için de yapılabilmektedir.

Veri Türü Oluşturmak

Oluşturulabilecek iki farklı veri türü vardır: yalnızca bir alana (yani, tek bir sayı veya dizgeye) sahip basit veri türleri ve birden fazla veri alanına (yani, birden çok dizgi, birden çok sayıya) sahip karmaşık veri türleri.

Basit bir veri türü tanımlamak için, sınıfın gerekli veri türü ile SimpleDataType <DataType> sınıfını genişletmesi ve getDefaultValue() metodunu uygulaması gerekmektedir. Bu örnekte, basit veri tipimiz olarak bir double kullanacağız.

public final class MyDoubleDataType extends SimpleDataType<Double> {
   private static final String NAME = "Double";
   private MyDataType() {
      super(NAME, Double.class);
   }
   @Override
   public Double getDefaultValue() {
      return 0.0;
   }
}

Sınıf constructor, yalnızca tek bir veri türü örneğinin var olmasını sağlamak için “özel” ayarına alınmaktadır.

Karmaşık bir veri türü tanımlamak için, sınıfın ComplexDataType sınıfını genişletmesi ve fromMap() ve getDefaultValue() metodlarını geçersiz kılması gerekmektedir. Karmaşık bir veri türü sınıfının nasıl gözükeceğini önceden görmek için MyPoint2D sınıfımızı örnek olarak kullanacağız.

public final class PointDataType extends ComplexDataType<MyPoint2D> {
   private static final String NAME = "MyPoint2D";
   public static final PointDataType Instance = new PointDataType();
   private PointDataType() {
      super(NAME, MyPoint2D.class);
   }
   @Override
   public Function<Map<String, Object>, MyPoint2D> fromMap() {
      return map -> {
         return new MyPoint2D((double) map.getOrDefault("x", 0.0), (double) map.getOrDefault("y", 0.0));
      };
   }
   @Override
   public MyPoint2D getDefaultValue() {
      // use default values of 0 for X and Y coordinates
      return new MyPoint2D(0, 0);
   }
}

Yukarıdaki kod, aşağıda belirtilen şekilde çalışmaktadır:

fromMap() metodu, bağlandığı NetworkTables girişindeki değerleri kullanarak yeni bir MyPoint2D oluşturmaktadır. getOrDefault` metodu, giriş değelerine erişemezse 0.0 olarak dönecektir. ``getDefaultValue herhangi bir kaynak yoksa yeni bir MyPoint2D nesnesi döndürecektir.

Veri Türünü Eklentiye Aktarma

Veri türünün Shuffleboard tarafından tanınması için, eklentinin getDataTypes metodunu geçersiz kılarak veri türlerini dışa aktarması gerekmektedir. Örneğin,

public class MyPlugin extends Plugin {
   @Override
   public List<DataType> getDataTypes() {
      return List.of(PointDataType.Instance);
   }
}