2023-05-18 09:57:27 +03:00
# WiréJS | Değişken değil, kablo kullanı n !
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
# Açı klama
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
WiréJS, dizinlenmiş akı llı değişkenler oluşturup kendi kendini yönetebilen veri değişimini kolayca yönetebilen sistemler oluşturabileceğiniz
yapı lar kurmanı za olanak sağlayan sistemdir.
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
Verileri wriré içerisinden oluşturarak değişimleri ile etkileyecek diğer değişkenleri bağı msı z yapı lar içinde yazabilirsiniz.
Ayrı ca verilerinizi sistematik olarak depolar bu sayede veri türünü okuma ve yazma olayları nı denetleyebilirsiniz (getter/setter)
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
# Kullanı m örneği
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
## Veri yazma
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
Tanı m
```typescript
declare function é(name: string, value: any): void;
```
### Basit
`name` ve `value` değerlerini `é` fonksiyonuna aktardı ğı nı zda bu ismi ve değeri global olarak depolar. Bu değeri istediğiniz herhangi bir noktada kullanabilirsiniz
2023-05-17 23:39:01 +03:00
```javascript
2024-10-08 23:41:50 +03:00
// İlk argümanı isim ve ikinci argümanı değer olarak alı r ve depolar
é('name', 'John');
é('surname', 'Carter');
é('age', '34');
```
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
### Gelişmiş
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
`name` alanı na verdiğiniz değerler dosya sistemi benzeri dizinlenmiş olarak saklanı r.
Teknik olarak `/` ile ayı rdı ğı nı z her alan için sistem o alan klasör gibi davranı r ve son eğik çizgiden sonraki isme o değeri kaydeder. Teknik olarak `name` , `surname` ve `age` değerleri `userform` adı altı nda tutulur ve izlenir
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
```javascript
é("userform/name/value", "John");
é("userform/name/required", true);
é("userform/surname/value", "carter");
é("userform/surname/required", true);
é("userform/age/value", "17");
é("userform/age/required", false);
```
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
## Veri okuma
Tanı m
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
```typescript
declare function é(name: string): any;
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
### Basit
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
Bir değeri okumak için `é` fonksiyonune değerin ismini yazmanı z yeterli
2023-05-17 23:39:01 +03:00
```javascript
2024-10-08 23:41:50 +03:00
let name = é("name");
console.log(name) // --> john
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
### Gelişmiş
Sistem yanlı zca değerleri döner, dizinleri vermez. Bu yüzden değişkenin tam ismini kullanmanı z gerekir
2023-05-17 23:39:01 +03:00
```javascript
2024-10-08 23:41:50 +03:00
é("userform/name/value", "John");
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
é("userform") // ----> undefined
é("userform/name") // ----> undefined
é("userform/name/value") // ----> "John" !!
é("userform/name/value/other") // ----> undefined
```
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
## Veriyi izleme
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
Tanı m
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
```typescript
declare function é(callback: function, variables:string[]): any;
```
`variables` ismindeki veriler değiştiğinde `callback` fonksiyonunu tetikler.
### Basit
```javascript
é("number1", 20);
é("number2", 40);
é("number3", 60);
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
é("average", 0);
é(() => {
let total = é("number1") + é("number2") + é("number3");
é("average", total / 3);
},["number1","number2","number3"]);
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
Yukarı daki kodda `number` isimli değişkenlerin herhangi birinin değişmesi durumunda en alttaki fonksiyonumuz çalı şarak `average` değerini güncelleyecektir.
Değişiklik izleme tiplemeleride dikkate alan karmaşı k bir karşı laştı rma algoritması üzerinden yapı lı r böylecek number, string, boolean değişimleri dı şı nda array ve object tipli değişkenlerin değerleri izlene rekürsif bir şekilde izlenir
```javascript
é("number1", 20);
é("number1", 20); // does nothing, no write, no access
é("number1", 21); // change detected, writed
é("number1", 21); // does nothing, no write, no access
é("object_variable", {var1: true,arr2: [1,2,3,[2]],callback: () => {}});
é("object_variable", {var1: true,arr2: [1,2,3,[2]],callback: () => {}}); // does nothing, no write, no access
é("object_variable", {var1: true,arr2: [1,2,3,[3]],callback: () => {}}); // does nothing, no write, no access
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
### Gelişmiş
Ayrı ca dizinlenmiş veriler için iç değerlerin değişimi, üst dizinlerden de izlenebilir
```javascript
é("userform/register/name/value", "John");
é("userform/register/name/required", true);
é("userform/register/surname/value", "carter");
é("userform/register/surname/required", true);
é("userform/register/age/value", "17");
é("userform/register/age/required", false);
é(()=>{
console.log("changed userform -> register")
},["userform/register"]);
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
`userform/register` dizinin altı ndaki herhangi bir değerin değişmesi durumunda callback çağı rı lacaktı r
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
## Okuma arabirimi (Middleware)
```typescript
declare namespace é {
function read(name: string, callback: (value:any) => any): void;
}
```
Okuma arabirimi bir değerin saklanması ndan sonra `é` fonksiyonu üzerinden geri çağı rı lması durumunda durumunda devreye girer. Bazı verileri saklandı ğı gibi değilde, farklı bir formatta almak istediğinizde kullanı şlı dı r. Nesneye yönelik dillerde getter gibidir **ancak burda değişkenin bulunması zorunlu değildir** , önce getter daha sonra değer belirlenebilir
2023-05-17 23:39:01 +03:00
```javascript
2024-10-08 23:41:50 +03:00
é.read("code",usernameValue => {
return `CODE#` + usernameValue;
2023-05-17 23:39:01 +03:00
});
2024-10-08 23:41:50 +03:00
é("code", 117);
console.log(é("code")) // ---> CODE#117
```
```javascript
é("person", null);
é("person/name", "John");
é("person/surname", "Carter");
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
é.read('person',function(){
return é("person/name") + " " + é("person/surname");
2023-05-17 23:39:01 +03:00
})
2024-10-08 23:41:50 +03:00
console.log(é("person")) // ---> "John Carter"
é("person/name", "Bell");
console.log(é("person")) // ---> "Bell Carter"
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
## Yazma arabirimi (Middleware)
```typescript
declare namespace é {
function write(name: string, callback: (value:any) => any): void;
}
```
Yazma arabirimi bir verinin kaydedilmesi sı rası nda devreye girer ve verilen verinin depolanmadan önce ek kontroller yapı lması na değiştirilmesini sağlamak için kullanı labilir. Nesneye yönelik dillerde setter gibidir **ancak burda değişkenin bulunması zorunlu değildir** , önce setter daha sonra değer belirlenebilir
Bir değerin tipinin değiştirilmesi
2023-05-17 23:39:01 +03:00
```javascript
2024-10-08 23:41:50 +03:00
é("integer_value", 217.7525);
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
é.write("integer_value",usernameValue => {
return parseInt(usernameValue);
});
console.log(é("integer_value")) // ---> 217
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
Bir listenin içerisindeki null verilerinin çı karı larak saklanması
```javascript
é.write("numberList",usernameValue => {
return usernameValue.filter(e => e != null)
});
é("numberList", [1, null, 7, 63, 74, null, 7, 15]);
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
console.log(é("numberList")) // ---> [1, 7, 63, 74, 7, 15]
```
> [!WARNING] Dikkat
> getter ve setter metotları belirlendiği andan itibaren devreye girer, kendinden önce ve sonraki depolama veya okuma operasyonları na karı şmaz
## Veriyi kı sı tlama
```typescript
declare namespace é {
function typedLock(name: string, {instance?:Function, type?:string, nullable?:boolean}): void;
}
```
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
### Veri tipini kı sı tlama
`typedLock` fonksiyonu belirlenen `name` değeri için tipleme ve değersizlik (nullable) kı sı tlamaları nı uygular. Bu tipleme isteğe bağlı olarak değiştirilebilir veya tekrar belirlenebilir
2023-05-17 23:39:01 +03:00
```javascript
2024-10-08 23:41:50 +03:00
é("person/name", "John");
é.typedLock("person/name",{
type: "string",
nullable: false
});
é("person/name", null); // ----> Uncaught Error: value is not typeof number
é("person/name", 27); /// -----> Uncaught Error: value is not typeof string
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
### Veri tipi kı sı tı nı kaldı rma
`typedLock` fonksiyonu belirlenen `name` değeri için tipleme ve değersizlik (nullable) kı sı tlama kuralları nı siler
2023-05-17 23:39:01 +03:00
```javascript
2024-10-08 23:41:50 +03:00
é("person/name", "John");
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
é.typedLock("person/name",{
type: "string",
nullable: false
2023-05-17 23:39:01 +03:00
});
2024-10-08 23:41:50 +03:00
é("person/name", null); // ----> Uncaught Error: value is not typeof number
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
é("person/name", 27); /// -----> Uncaught Error: value is not typeof string
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
é.typedUnLock("person/name");
é("person/name", null); // ----> success, allowed!
é("person/name", 27); /// -----> success, allowed !
```
## Seti temizleme
WiréJS'de veriler ile arabirim ve veri tipi kı sı tlayı cı ları vs. ayrı ayrı tutulur. Veri bellek içerisinden silinse veya null değeri verilse dahil dinleyiciler aktif olarak çalı şı r.
```typescript
declare namespace é {
function delete(name: string): void;
}
```
Verilen veri isminden tüm verileri, kı sı tlayı cı ları , okuma ve yazma arabirimlerini temizler.
```javascript
é("name", "john");
// use updated callback
é(()=> console.log("name changed"),['name']);
// use setter callback
é.read('name',value => `--${value}--` );
é('name'); // ---> "--john---"
é('name','Bell'); // ---> name changed
// Delete name value, remove updated callbacks and setter callbacks
é.delete("name");
é('name'); // ---> undefined
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
é('name','Kyra'); // ---> do nothing....
é('name','Oliver'); // ---> do nothing....
é('name'); // ---> "Oliver"
2023-05-17 23:39:01 +03:00
```
2024-10-08 23:41:50 +03:00
## Detaylar
### DOM ile birlikte kullanma
2023-05-17 23:39:01 +03:00
```javascript
2024-10-08 23:41:50 +03:00
let nameInput = document.createElement("input");
// input değiştiğinde bildir
nameInput.oninput = () => é('name', nameInput.value);
é.read('name/valid',value => value.trim() != "");
let surnameInput = document.createElement("input");
// input değiştiğinde bildir
surnameInput.oninput = () => é('surname', surnameInput.value);
é.read('surname/valid',value => value.trim() != "");
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
let errorSpan = document.createElement("span");
é(() => surnameInput.value = é('message'),['message']);
2023-05-17 23:39:01 +03:00
2024-10-08 23:41:50 +03:00
let submitButton = document.createElement("button");
submitButton.disabled = true;
// submit_isActive değeri değiştiğinde disabled özelliğini değiştir
é(() => {
submitButton.disabled = !é("submit_isActive")
},["submit_isActive"]);
é(()=>{
if(é("name/valid") & & é("surname/valid")){
é('message', "Form's input is valid")
é("submit_isActive", true)
}else{
é('message', "Please fill all inputs")
é("submit_isActive", false)
2023-05-17 23:39:01 +03:00
}
2024-10-08 23:41:50 +03:00
},["name","surname"]);
```
### Fark algoritması nı değiştirme
Bazen verilerin değişimini algı lamak için tipleri veya verinin içeriği kontrol etmek gereksiz olabilir. Senaryonuzu karmaşı k veriler dı şı nda basit primitive veriler üzerine kurguluyorsanı z fark algoritması nı basitleştirerek performansı yarı yarı ya artı rabilirsiniz
```typescript
declare namespace é {
function diff(callback: (oldValue?:any, newValue?:any) => boolean): void;
}
```
Belirli bir verinin farklı bir algoritma kullanı larak karşı laştı rı lması nı sağlar
Örneğin sizin için basit bir (tipleme koruması z) bir karşı laştı rma yetiyor olabilir
```javascript
é("number", 4);
é("number", 5); // ----> changed
é.diff("number", (oldValue, newValue) => oldValue != newValue);
é("number", 6); // ----> changed !
é("number", 0); // ----> changed !
é("number", false); // ----> no change
é("number", null); // ----> no change
é("number", undefined); // ----> no change
é("number", []); // ----> no change
é("number", 3); // ----> changed !
é("number", 1); // ----> changed !
é("number", true); // ----> no change
```
Veya ortalaması aynı olan bir listenin eşitlenmesi gereksiz bir durum olabilir
```javascript
é("numberList", [ 0, 1, 2, 3]);
é("numberList", [-1, 1, 2, 3, 4]); // ----> changed !
é.diff("numberList", (oldValue, newValue) => {
let oldValueSum = oldValue.reduce((sum, num) => sum + num, 0) / oldValue.length;
let newValue = newValue.reduce((sum, num) => sum + num, 0) / newValue.length;
return oldValueSum != newValue
2023-05-17 23:39:01 +03:00
});
2024-10-08 23:41:50 +03:00
é("numberList", [2]);
é("numberList", [ 1, 2, 3]); // ----> no change, no write
é("numberList", [ 0, 1, 2, 3, 4]); // ----> no change, no write
é("numberList", [-2, 0, 2, 4, 6]); // ----> no change, no write
é("numberList", [+1, 2, 3, 4, 5]) // ----> changed !
```
Bu karşı laştı rmanı n sonucunu depolamadı ğı gibi aynı zamanda dinleyicileride çalı ştı rmayacaktı r