İçindekiler
- Bu Seçim Neden Bu Kadar Önemli?
- İki Yaklaşım Aslında Ne?
- Fiori Elements Pratikte: Ekranı Backend Çizer
- Freestyle Pratikte: Her Davranışı Siz Yazarsınız
- Yan Yana Karşılaştırma
- Freestyle'a Geçmeden Önce: Uzantı Noktaları
- Ara Yol: Flexible Programming Model
- Karar Verirken Sorulacak Sorular
- Sık Yapılan Hatalar
- Sonuç
Fiori projelerinin başında hemen her zaman aynı soru sorulur: "Bunu Fiori Elements ile mi yapalım, yoksa Freestyle mı yazalım?" Cevap çoğu zaman teknik bir değerlendirmeyle değil, ekibin alışkanlığıyla verilir. UI5 bilen bir ekip her şeyi Freestyle yazar; ABAP ağırlıklı bir ekip her şeyi Elements'a sığdırmaya çalışır.
Bu yazıda iki yaklaşımın gerçekte ne olduğunu, ikisinin arasında kalan ve çoğu projede gözden kaçan üçüncü yolu ve karar verirken kullanılabilecek kriterleri kod örnekleriyle anlatıyorum. Fiori'nin tasarım prensiplerine genel bir giriş için önce Fiori ve UX yazısına göz atabilirsiniz.
Bu Seçim Neden Bu Kadar Önemli?
Bir Fiori uygulamasının maliyetinin büyük kısmı ilk sürümde değil, sonraki yıllarda ortaya çıkar: yeni alan istekleri, UI5 sürüm yükseltmeleri, yeni cihazlar, ekip değişiklikleri. Yaklaşım seçimi bu maliyetin kimin omzuna ve hangi biçimde bineceğini belirler.
- Gereksiz yere Freestyle: Standart bir liste-detay ekranını elle yazdığınızda filtre çubuğu, varyant yönetimi, tablo kişiselleştirme, Excel'e aktarma, mesaj yönetimi gibi Elements'ın hazır verdiği her şeyi siz yazarsınız — ve bakımını da siz yaparsınız.
- Zorla Elements: Şablona uymayan bir etkileşimi Elements'a sığdırmaya çalıştığınızda, framework'ün iç yapısına dayanan uzantılar birikir. Bu uzantılar ilk UI5 yükseltmesinde kırılmaya adaydır.
İki hata da geri dönüşü pahalı kararlardır; çünkü yaklaşımı sonradan değiştirmek, pratikte uygulamayı yeniden yazmak demektir.
İki Yaklaşım Aslında Ne?
Fiori Elements: ekranı şablon üretir
Fiori Elements'ta ekranı siz yazmazsınız; SAP'nin hazır sayfa şablonları (floorplan) çalışma anında üretir. Şablon, OData servisinin metadata'sını ve annotation'larını okur; hangi alanın listede, hangisinin filtrede, hangisinin detay sayfasında hangi grupta gösterileceğine buna göre karar verir.
Sık kullanılan şablonlar: List Report + Object Page (liste-detay), Worklist, Analytical List Page ve Overview Page. Uygulamanın kendisi çoğunlukla bir manifest.json ve birkaç ayardan ibarettir; JavaScript kodu ya hiç yoktur ya da çok azdır.
Freestyle SAPUI5: ekranı siz kurarsınız
Freestyle'da XML view'ları, controller'ları, model bağlamalarını, yönlendirmeyi (routing) ve hata yönetimini siz yazarsınız. SAPUI5 kontrol kütüphanesinin (sap.m, sap.ui.table, sap.f…) tamamı emrinizdedir; sınır, ekibinizin yazıp bakımını yapabileceği kod miktarıdır.
Freestyle "Fiori değil" anlamına gelmez. Doğru kontrollerle ve tasarım kılavuzuna uyularak yazılmış bir Freestyle uygulama tamamen Fiori uyumludur; yalnızca bu uyumu şablon size otomatik vermez, emekle sağlarsınız.
Fiori Elements Pratikte: Ekranı Backend Çizer
RAP ile modellenmiş bir satış siparişi uygulaması düşünelim. CDS projection view'ı hazır ve @Metadata.allowExtensions: true ile işaretli olsun — bu katmanın nasıl kurulduğunu OData V4 / CDS yazısında adım adım anlattım. Ekranın tamamı bir metadata extension dosyasında tarif edilir:
@Metadata.layer: #CUSTOMER
@UI.headerInfo: { typeName: 'Sipariş',
typeNamePlural: 'Siparişler',
title: { type: #STANDARD, value: 'SalesOrder' } }
annotate entity ZC_SalesOrder with
{
@UI.facet: [ { id: 'General', purpose: #STANDARD, position: 10,
type: #IDENTIFICATION_REFERENCE, label: 'Genel Bilgiler' },
{ id: 'Items', purpose: #STANDARD, position: 20,
type: #LINEITEM_REFERENCE, label: 'Kalemler',
targetElement: '_Item' } ]
@UI.lineItem: [ { position: 10 },
{ type: #FOR_ACTION, dataAction: 'approve', label: 'Onayla' } ]
@UI.selectionField: [ { position: 10 } ]
@UI.identification: [ { position: 10 } ]
SalesOrder;
@UI.lineItem: [ { position: 20 } ]
@UI.selectionField: [ { position: 20 } ]
@UI.identification: [ { position: 20 } ]
Customer;
@UI.lineItem: [ { position: 30, criticality: 'StatusCriticality' } ]
@UI.identification: [ { position: 30, criticality: 'StatusCriticality' } ]
OverallStatus;
@UI.hidden: true
StatusCriticality;
}Bu tek dosya şunları üretir: filtre çubuğunda iki alan, sonuç tablosunda üç sütun ve durum renklendirmesi, satır seçildiğinde etkinleşen bir Onayla düğmesi ve detay sayfasında iki bölüm — genel bilgiler formu ile kalem tablosu.
Onayla düğmesinin arkasındaki iş kuralı da backend'dedir. Projection behavior definition'da tek satırla dışarı açılır:
projection;
strict ( 2 );
define behavior for ZC_SalesOrder alias SalesOrder
{
use update;
use action approve;
}Düğmenin ne zaman aktif olacağı (feature control), hangi doğrulamaların çalışacağı, hata mesajının hangi alana bağlanacağı — hepsi RAP davranış katmanında tanımlanır ve Elements bunları kendiliğinden yansıtır. İş nesnesi draft destekliyse, kaydedilmemiş değişikliklerin korunması da buna dahildir.
Annotation yazmadan kazandığınız şeyler de var. List Report şablonu varyant yönetimini, tablo kişiselleştirmeyi, tabloyu elektronik tabloya aktarmayı, mesaj yönetimini ve klavye erişilebilirliğini hazır getirir. Bunların hiçbiri sizin kodunuz değildir; dolayısıyla UI5 yükseltildiğinde iyileştirmeler de kendiliğinden gelir.
Freestyle Pratikte: Her Davranışı Siz Yazarsınız
Şimdi farklı bir ekran: depoda el terminaliyle çalışan bir toplama (picking) uygulaması. Kullanıcı barkodu okutur; uygulama ilgili kalemi bulur, işaretler, giriş alanını temizler ve bir sonraki okutmayı bekler. Bu ekran bir iş nesnesinin listesi değil, bir etkileşim akışıdır — ve Freestyle'ın tam olarak güçlü olduğu yer burasıdır.
<mvc:View controllerName="z.picking.controller.Main"
xmlns:mvc="sap.ui.core.mvc"
xmlns="sap.m">
<Page title="{i18n>pickingTitle}">
<Input id="scanInput"
placeholder="{i18n>scanPlaceholder}"
submit=".onScan"/>
<List id="itemList"
mode="MultiSelect"
items="{/PickingItem}">
<ObjectListItem title="{Material}"
number="{Quantity}"
numberUnit="{Unit}"/>
</List>
</Page>
</mvc:View>sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/m/MessageToast"
], function (Controller, MessageToast) {
"use strict";
return Controller.extend("z.picking.controller.Main", {
// Okuyucu barkodu yazar ve Enter gönderir: submit olayı tetiklenir
onScan: function (oEvent) {
const sBarcode = oEvent.getParameter("value").trim();
const oItem = this.byId("itemList").getItems().find(function (oListItem) {
return oListItem.getBindingContext().getProperty("Barcode") === sBarcode;
});
if (!oItem) {
MessageToast.show(this._text("barcodeNotFound", [sBarcode]));
return;
}
oItem.setSelected(true);
oEvent.getSource().setValue("");
},
_text: function (sKey, aArgs) {
return this.getView().getModel("i18n").getResourceBundle().getText(sKey, aArgs);
}
});
});El terminallerindeki barkod okuyucuların çoğu klavye gibi davranır: okunan değeri giriş alanına yazar ve Enter gönderir. Bu yüzden submit olayı yeterlidir; ek bir donanım kütüphanesi gerekmez.
Kod kısa, ama dikkat edin: filtreleme, sıralama, varyant, Excel'e aktarma, sayfalama, mesajların toplu gösterimi — hiçbiri yok. Gerekirse her birini siz ekleyeceksiniz. Freestyle'ın bedeli ilk sürümde değil, bu listenin her yeni maddesinde ödenir.
Yan Yana Karşılaştırma
| Kriter | Fiori Elements | Freestyle SAPUI5 |
|---|---|---|
| Standart liste-detay ekranında hız | Çok yüksek; ekran annotation'lardan üretilir | Düşük; her bileşen elle kurulur |
| Esneklik | Şablonun ve uzantı noktalarının sınırları içinde | Sınırsız; sınır ekibin kapasitesi |
| Tasarım tutarlılığı | Otomatik; bütün uygulamalar aynı davranır | Ekibin disiplinine bağlı |
| UI5 yükseltmeleri | Yeni özellikler kendiliğinden gelir | Kullanımdan kalkan API'lerin temizliği sizin işiniz |
| Bakımı kim yapar? | ABAP/CDS bilen ekip | UI5/JavaScript bilen ekip |
| Backend beklentisi | Annotation'lı, iyi modellenmiş OData servisi (ideali RAP) | Her türlü OData veya REST kaynağı |
| Test | İş kuralları backend'de, ABAP Unit ile | Ek olarak frontend testi (QUnit, OPA5) gerekir |
| Tipik kullanım | Liste-detay, onay akışı, ana veri bakımı, analitik liste | Tarama, sürükle-bırak, planlama panosu, sihirbaz, cihaz entegrasyonu |
Freestyle'a Geçmeden Önce: Elements'ın Uzantı Noktaları
"Elements bunu yapamıyor" cümlesini duyduğumda ilk sorum şudur: hangi katmanda denendi? OData V4 tabanlı Fiori Elements'ta çözüm sırasıyla şu katmanlarda aranmalıdır:
1. Annotation
Sorunların çoğu burada çözülür: alan sırası, gruplama, gizleme, renklendirme, değer yardımı ve bir alan değiştiğinde diğerlerinin yenilenmesini sağlayan yan etkiler (side effects). "Elements kısıtlı" şikâyetlerinin önemli bir kısmı aslında eksik modellenmiş bir servisten gelir.
2. manifest.json ayarları
Tablo tipi (responsive, grid, analitik), sayfa açılırken verinin hemen yüklenip yüklenmeyeceği, Flexible Column Layout ve varsayılan sıralama gibi davranışlar kod yazmadan ayarlanır.
3. Uzantı noktaları: özel sütun, bölüm ve aksiyon
Şablonun belgelenmiş yerlerine kendi fragment'ınızı ve controller kodunuzu yerleştirirsiniz. Bu üç katman yetmediğinde sıradaki adım, bir sonraki bölümde anlattığım Flexible Programming Model'dir.
Örneğin detay sayfasına, kalemlerin hemen ardından gelen özel bir harita bölümü eklemek manifest'te birkaç satırdır:
"SalesOrderObjectPage": {
"type": "Component",
"id": "SalesOrderObjectPage",
"name": "sap.fe.templates.ObjectPage",
"options": {
"settings": {
"contextPath": "/SalesOrder",
"content": {
"body": {
"sections": {
"deliveryMap": {
"template": "z.orders.ext.fragment.DeliveryMap",
"title": "{i18n>deliveryMap}",
"position": { "placement": "After", "anchor": "Items" }
}
}
}
}
}
}
}Bu bölümün içi tamamen sizindir: bir harita kontrolü, özel bir grafik veya üçüncü taraf bir bileşen olabilir. Sayfanın geri kalanı annotation'lardan üretilmeye devam eder. Liste tablosuna özel bir düğme eklemek de aynı mantıkla, manifest'te controlConfiguration altında tanımlanır.
Ara Yol: Flexible Programming Model
Seçimi ikili düşünmek artık güncel değil. OData V4 tabanlı Fiori Elements, Flexible Programming Model (FPM) adı verilen bir yaklaşım sunar: Elements'ın parçalarını — tablo, filtre çubuğu, form, grafik — building block olarak kendi XML view'ınızda kullanırsınız. Bu parçalar yine annotation'lardan beslenir; aralarındaki her şey sizin kodunuzdur.
<mvc:View controllerName="z.orders.ext.main.Main"
xmlns:mvc="sap.ui.core.mvc"
xmlns="sap.m"
xmlns:macros="sap.fe.macros">
<Page title="{i18n>ordersTitle}">
<!-- Tamamen serbest: kendi kontrolünüz, kendi davranışınız -->
<Input id="orderScanInput" submit=".onScan"/>
<!-- Elements yapı taşları: CDS annotation'larından üretilir -->
<macros:FilterBar id="orderFilter"
metaPath="@com.sap.vocabularies.UI.v1.SelectionFields"/>
<macros:Table id="orderTable"
metaPath="@com.sap.vocabularies.UI.v1.LineItem"
filterBar="orderFilter"/>
</Page>
</mvc:View>Bu sayfanın controller'ı standart Controller yerine sap/fe/core/PageController'dan türetilir; böylece Elements'ın yönlendirme, draft ve mesaj altyapısı kullanılmaya devam eder. Böyle bir sayfa, normal bir List Report / Object Page uygulamasının içinde özel sayfa (custom page) olarak da yaşayabilir.
FPM'in pratik anlamı şu: "ekranın çoğu standart, bir kısmı özel" durumu artık iki kötü seçenek arasında tercih yapmayı gerektirmiyor. Filtre çubuğu ve tablo, Elements'ın varyant ve kişiselleştirme yetenekleriyle hazır gelir; siz yalnızca şablona sığmayan parçayı yazarsınız.
Bir kısıt: FPM yalnızca OData V4 tabanlı Elements'ta (sap.fe) vardır. V2 tabanlı mevcut uygulamalarda bu yol yoktur — yeni geliştirmelerde V4'ü seçmek için bir sebep daha.
Karar Verirken Sorulacak Sorular
Yeni bir uygulama talebinde şu sırayla ilerlemek, kararı çoğu zaman kendiliğinden verir:
- Ekran bir iş nesnesi etrafında mı dönüyor? Liste, detay, oluştur/değiştir, onayla/reddet — cevap evetse varsayılan seçenek Fiori Elements'tır.
- Backend RAP/CDS ile modellenebiliyor mu? Elements'ın kalitesi servisin kalitesini aşamaz. Servis eski bir BAPI'nin üzerine ince bir kabuksa önce servisi doğru kurmak gerekir; RAP aynı zamanda ABAP Cloud ve clean core modelinin de temelidir. Veri gerçekten modellenemiyorsa (örneğin birden çok sistemden anlık birleştiriliyorsa) Freestyle gerçekçi bir seçenek olur.
- Şablona uymayan kısım ne kadar büyük? Bir bölüm ya da birkaç düğmeyse uzantı noktaları; bir sayfanın tamamıysa FPM custom page; uygulamanın bütünü bir etkileşim akışıysa (tarama, planlama panosu, sürükle-bırak) Freestyle.
- Bakımı kim yapacak? Şirkette UI5 geliştiricisi yoksa ve olmayacaksa, Freestyle uygulama ilk değişiklik isteğinde sahipsiz kalır. Bu kriter teknik kriterler kadar ağır basmalıdır.
- Uygulamanın ömrü ne kadar? Birkaç ay kullanılacak geçici bir araçla yıllarca yaşayacak bir çekirdek süreç uygulaması aynı şekilde değerlendirilmez. Uzun ömürlü uygulamalarda UI5 yükseltme maliyeti belirleyicidir.
Sık Yapılan Hatalar
İş kuralını frontend'e yazmak
Doğrulama, hesaplama ve yetki kontrolü UI controller'ında değil, RAP davranış katmanında olmalıdır. Bu hem Elements hem Freestyle için geçerlidir: frontend'deki kural atlanabilir ve aynı servisi kullanan diğer tüketiciler — başka bir uygulama, bir entegrasyon — o kuralı hiç görmez. Backend'deki kural ise ABAP Unit ile test edilebilir.
Annotation'ları uygulamanın yerel dosyasına yığmak
SAP Fiori tools, uygulamanın içinde yerel bir annotation dosyası tutmanıza izin verir. Yalnız o uygulamaya özgü küçük ayarlar için makuldür; ama alan etiketleri, değer yardımları ve gruplamalar CDS'te yaşamalıdır. Aksi hâlde aynı servisi kullanan iki uygulama iki farklı gerçeklik gösterir.
Annotation'ları denemeden "Elements esnek değil" demek
Bu çoğu zaman teknik bir sınır değil, yetkinlik açığıdır. Freestyle'a geçme kararından önce aynı ihtiyacın annotation, manifest ayarı veya uzantı noktasıyla çözülüp çözülemeyeceğini somut olarak sınayın; SAP Fiori tools'un Page Map ve Guided Development araçları bu araştırmayı hızlandırır.
Freestyle'da Fiori kılavuzunu atlamak
Özel renkler, standart dışı düğme yerleşimleri, elle yazılmış tablo kontrolleri — kullanıcı bu uygulamadan Launchpad'deki diğer uygulamalara geçtiğinde farkı hemen hisseder. Freestyle'ın özgürlüğü, tasarım tutarlılığından vazgeçmek için bir izin değildir.
Freestyle'da sabit ID vermemek
Key user'ların Launchpad üzerinden yaptığı ekran uyarlamaları (UI adaptation) ve otomatik testler, kontrollerin sabit (stable) ID'lerine dayanır. Elements bu ID'leri kendisi üretir; Freestyle'da her önemli kontrole anlamlı bir ID vermek sizin sorumluluğunuzdadır.
Sonuç
Fiori Elements ile Freestyle arasındaki seçim bir zevk meselesi gibi görünse de aslında bir sahiplik kararıdır: ekranın tarifi backend'de mi yaşayacak, frontend kodunda mı? Kurumsal uygulamaların önemli bir kısmı liste, detay ve işlem kalıbına uyar; bu uygulamalar için Elements hem daha hızlı teslim edilir hem de yıllar içinde daha ucuza yaşar.
Freestyle gereksiz değildir — yalnızca istisna olmalıdır. Etkileşimin kendisi şablonun dışındaysa doğru araçtır. İkisinin arasındaki geniş alanı ise artık uzantı noktaları ve Flexible Programming Model kapatıyor.
Bir sonraki Fiori talebinde ilk soru "hangi teknoloji?" değil, "bu ekran hangi iş nesnesinin etrafında dönüyor?" olsun. Fiori projelerinde sunduğum kapsamı Fiori & UI hizmet sayfasında bulabilirsiniz.
Fiori uygulamalarınız için yaklaşım seçimi, RAP servis tasarımı ve geliştirme desteği alın.
Ön Görüşme Talep Et