Tag Archives: writeline

Workflow Foundation 4.0 ile Temel Elemanları Eklemek

Workflow Foundation 4.0, bize kullanmak için If, While, Assign, Sequence gibi yönetimsel elemanlar sunar. Bu yazıda bu elemanların nasıl kullanılacağına dair bilgiler vermeye çalışacağım.

WF 4.0 kullanıcıları workflow elemanları tarafından kullanılan tüm değişkenleri tanımlamak zorundadırlar. Şimdi projemize iki adet değişken tanımlayalım. Birinci değişkenimiz kaç adet zile ihtiyacımız olduğunu gösteren NumberOfBells, diğerini de şimdiye kadar kaç defa zil duyulduğunu gösteren Counter. Peki bu değişkenleri nasıl tanımlıyoruz?

Öncelikle projemize bir adet Sequence aktivitesi ekleyelim. Daha sonra bu aktivitenin üzerine bir defa tıklayıp tasarım kısmında sol altta bulunan “Variables” sekmesine tıklayalım. Daha sonra “Create Variable” kısmına tıklayıp ismi Counter olan tipi de Int32 olan bir değişken kaydedelim. Scope kısmını Sequence olarak bırakabilirsiniz. Bunun anlamı; o değişken Sequence ve onun soyundan gelen tüm aktiviteler tarafından kullanılabilir olmasıdır. Aynı şekilde tekrar “Create Variable” diyelim. Bu sefer değişkenimizi Properties penceresinden tanımlayalım. İsmi NumberOfBells ve tipi de Int32 olan bir değişken tanımlayalım. Scope kısmını yeniden Sequence olarak bırakalım.

WF-VariableDefinition

WF-Properties2

Daha sonra ifadeler yazabileceğimiz yukarıdaki resimde kırmızı kutu içerisinde gösterdiğim Expression Editor’ü açalım. Ve oraya DateAndTime.Now.Hour ifadesini yazalım.

WF-ExpressionEditor

Bu ifadeyi default propertie olarak kaydedelim. Bu işlem NumberOfBells değişkenini günün o andaki saat değerine atar. Bu işlemden sonra değişkenlerimiz aşağıdaki şekilde görünmelidir.

WF-Variables3

Şimdide IF kullanımına bakalım;

DateAndTime sınıfının Hour üyesi geriye 24 saatlik sistemde saati geri döndürür. Örneğin; saat öğleden sonra 3 ise geriye 15 değerini döndürür. Öncelikle diagramımızda bulunan Sequence yapısının içine Toolbox’ta bulunan Writeline aktivitesini sürükleyip bırakalım. Daha sonra bu aktivitenin DisplayName özelliğini Merhaba olarak değiştirelim. Tekrar Sequence içerisine bir If aktivitesi sürükleyip bırakalım.

NOT: Bu adımda If ve Sequence aktivitelerinin sağ üst köşelerinde kırmızı renkli hata kutuları çıkacaktır. If aktivitesindeki kutucuk If aktivitesi içerisinde henüz herhangi bir koşul (condition) yazılmadığını, Sequence aktivitesindeki kutucuk ise ya bu aktivitede ya da alt aktivitelerinde bir hata olduğunu gösterir. Bu hataları kutucukların üstüne gelerek görebilirsiniz.

WF-If

Şimdi If aktivitesini Properties kısmından DisplayName özelliğini “PM için ayarla” olarak değiştirelim. If aktivitesinin 3 kısmı vardır. Condition kısmı hangi koşulun hesaplanacağını gösterir. Bir Boolean (true ya da false) değer çözmelidir bu koşul. Eğer ifade True is Then aktivitesi, eğer ifade False ise Else aktivitesi çalıştırılır. Hem Then hem de Else aktivitelerinin ikisini birden tanımlamak zorunda değiliz. Eğer hiçbir aktivite tanımlanmasa, hiçbir aktivite çalıştırılmaz. Şimdi koşulumuza NumberOfBells>12 ifadesini girelim.

Şimdi de Assign aktivitesini Then kısmımızın içine sürükleyip bırakalım. Assign aktivitesi size bir değişkene ya da bir argümana bir değer atamanıza imkan verir. Hem To hem de Value özelliklerinin bir ifade içerebileceğine dikkat edin. To özelliğine NumberOfBells, Value özelliğine de NumberOfBells – 12 ifadelerini girelim.

WF-Properties2

WF 4.0’da bir çok aktivite compound aktivitedir yani başka aktiviteleri içerebilirler. If aktivitesi buna güzel bir örnek olarak gösterilebilir.

Sıra geldi While aktivitesini kullanmaya. While aktivitesini, ismi “PM için ayarla” olan If aktivitesinin altına sürükleyip bırakalım. Ardından DisplayName özelliğini “Zil Çalınma Sayısı” olarak değiştirelim.

WF-While

While aktivitesi, içerisinde yazılan ifade true olduğu sürece Body kısmındaki aktiviteleri çalıştırır. İlk önce koşul hesaplanır, eğer true ise, içindeki aktiviteler çalıştırılır. Bu durum, koşul false olana kadar devam eder.

NOT: İleride göreceğimiz DoWhile aktivitesi ile While aktivitesi arasındaki fark, programlama olduğu gibidir. DoWhile aktivitesinde önce içindeki aktiviteler bir kez çalıştırılır, sonra koşul çalıştırılıp true olup olmadığı kontrol edilir. While aktivitesinde ise, önce koşul çalıştırılır. Koşul true ise içindeki aktiviteler çalıştırılır. Eğer koşul false ise içindeki ifadeler hiçbir zaman çalıştırılmazlar.

While aktivitesinin koşul kısmına Counter <= NumberOfBells ifadesini yazalım. Daha sonra Body kısmına bir Sequence aktivitesini sürükleyip bırakalım. Bunun da DisplayName özelliğini “Zil Çalınma Sayısı” olarak değiştirelim.

WF-Sequence

Şimdi bu “Zil Çalınma Sayısı” isimli Sequence aktivitemizin içine bir Writeline aktivitesi sürükleyip bırakalım. Writeline aktivitesinin Text özelliğine de Counter.ToString() ifadesini yazalım. Bunun amacı kaç kere zil çaldığını konsola yazdırmaktır. Ardından bu Writeline aktivitesinin altına bir Assign aktivitesi yerleştirelim. To kısmına Counter, Value kısmına ise Counter + 1 yazalım. Bu kısaca Counter değişkenini bir arttıracaktır.

WF-Assign2

Ardından bu Assign aktivitesinin altına bir Delay aktivitesi sürükleyip bırakalım. Kısaca Delay aktivitesi, belirli bir zaman periyodu için o aktiviteyi durdurur. Delay aktivitesinin Duration adında tek bir özelliği vardır. Bu özellik aktivitenin ne kadar duracağını gösterir.  Bu özelliğe TimeSpan.FromSeconds(1) ifadesini yerleştirelim.

“Zil Çalınma Sayısı” adındaki While aktivitesini sağ üst köşesinden daraltalım.

WF-Collapse

Sonra da bu While aktivitesinin altına bir Writeline aktivitesi ekleyelim. DisplayName özelliğini “Zaman:” , Text özelliğini de “Şu anki zaman: ” + DateTime.Now.ToString() şeklinde yazalım.

“Zaman” aktivitesinin altına da bir If aktivitesini sürükleyelim ve ismini de “Selamlama” olarak koyalım. Koşul kısmına da DateTime.Now.Hour >= 18 ifadesini yerleştirelim. Şimdi de Selamlama aktivitesinin içindeki Then ve Else kısımlarına da birer Writeline aktivitesi yerleştirelim. Then kısmındaki aktivitenin Text özelliğine “İyi Akşamlar”, Else kısmındaki aktivitenin Text özelliğine de “İyi Günler” yazalım. Şimdi de projemizi kaydedip F5 ile çalıştıralım.

0
1
2
3
4
5
Şu anki zaman: 30.07.2012 17:00:16
İyi Günler
Press any key to continue . . .

 

Görüleceği üzere 0-5 arası her rakamı yazdırırken 1 saniye bekleme yaptı program. Bu durum Delay aktivitesi sayesinde gerçekleşir.

Bu yazıda Workflow Foundation içerisindeki, bizim de programlama dillerinden bildiğimiz ifadelerin aktivitelerini inceledik.

Workflow Foundation 4.0’a Giriş

.NET 4.0 içerisinden Workflow Foundation (ayrıca WF 4.0 olarak anılır) workflow tabanlı uygulamaların geliştirilmesi için yeni bir örnek ifade eder.

Şimdi basit bir workflow oluşturma ile işe başlayalım. Visual Studio 2010’u çalıştırıp New Project linkine tıklayalım. Installed Templates’in altında, Visual C#’ın içerisinde, 4 adet farklı template’in var olduğunu göreceğiz. Buradan Windows Console Application’ı seçelim ve projemizin ismini HelloWF olarak adlandıralım.

HelloWF

Bu adım bize bir adet konsol uygulaması için Program.cs  ve Workflow1.xaml adında workflow’unuzdaki aktiviteleri tanımlayan dosyalar üretilir. XAML dosyası, iş akışı tanımınızdaki aktivite-türetilen elementleri içerir. Visual Studio 2010 size bu tür elementleri düzenlemeniz için grafiksel olarak bir arayüz imkanı tanır. Burada klasik bir VS 2010 arayüzünü görüyoruz. Sağ tarafta Solution Explorer, Properties, sol tarafta Toolbox, Server Explorer, alt tarafta ise Errors, Warnings ve Messages kısımlarını görmekteyiz (Tabi bu kısımların IDE içerisinde yerlerinin kişiden kişiye değişebileceğini unutmayalım.)

WF-IDE

Orta tarafta ise WF tasarım kısmını görüyoruz. Sağ altta zoom için gerekli olan seçenekleri ve Overview seçeneklerini görüyoruz. Zira Workflow Foundation içerisinde oluşturabileceğiniz aktiviteler çok büyük olabileceği için bu kontroller bize büyük resim içerisinde küçük resmi görebilmek için çok büyük avantaj sağlayacaklardır. Sol alt tarafta ise 3 adet kontrolümüz var. “Variables”, “Arguments” ve assembly dosyalarını içeren “Imports”. Variables kısmına tıkladığımızda var olan değişkenleri içeren bir pencere açılacaktır.

WF-Variables

Eğer oluşturduğunuz workflow’u bir sınıf olarak düşünürsek, variables kısmı sınıf üyeleri olarak düşünebiliriz. Bunlarla aktiviteler arasındaki paylaşılan verileri tutabilirsiniz. Bu değişkenleri isterseniz tüm workflow için, isterseniz belirli bir aktivite için tanımlayabilirsiniz. Arguments kısmı tıpkı değişkenler gibidir, farklı olarak workflow dışına veri geçisini sağlayabilirler. Bunları method parametreleri olarak düşünebiliriz. Not olarak; buradaki Direction kolonu, verinin nereye geçtiğini ya da workflow dışında nereye gönderildiğini gösterir.

WF-Arguments

 

~Workflow Tasarımı~

Workflow’u ilk oluşturduğumuzda tasarım kısmının boş olduğunu görürüz. Aktiviteleri sürükle bırak mantığı ile workflow’umuza ekleriz. Şimdi Workflow Foundation içerisinde küçük bir “Hello World” uygulaması yaratalım. Başlangıç için, Sequence aktivitesini tasarım alanına sürükleyip bunun içerisinde Writeline aktivitesini sürükleyelim. Diagram aşağıdaki şekilde görünecektir;

WF-Sequence-Writeline

Ayrıca Properties kısmı aşağıdaki şekilde görünür.

WF-Properties

Buradaki DisplayName özelliğini Hello şeklinde değiştirelim ki, bir çok Writeline aktivitemizin olduğu diagramlarda bu yapıları hatırlamamız kolaylaşsın. Ayrıca Text özelliğine “Hello, World!” kelimelerini giriş yapalım. Tasarım kısmında da aynı anda Writeline aktivitesinin içerisinde bu stringi görebiliriz. TextWriter özelliğini boş bırakabiliriz. Default olarak, bu text konsola yazılacaktır. Eğer spesifik bir uygulama yapmak isterseniz buraya TextWriter’dan türetilmiş sınıf yapılarını da yazabiliriz. Şimdi de Program.cs dosyamızda değişiklikler yapalım. Bu dosyayı ilk açtığımızda aşağıdaki şekilde görürüz;


using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;

namespace HelloWF
{

class Program
{
static void Main(string[] args)
{
WorkflowInvoker.Invoke(new Workflow1());
}
}
}

Statik WorkflowInvoker sınıfı Workflow1 sınıfı tarafından tanımlanmış workflow’u başlatır. Şimdi Main() methodumuzun içerisine aşağıdaki kodları ekleyelim;

Console.WriteLine(“ENTER to exit”);
Console.ReadLine();

Daha sonra projemizi F5 ile çalıştırdığımızda, aşağıdaki şekilde bir konsol çıktımız olur.

Hello, World!
ENTER to exit

Bu makalede Windows Workflow Foundation’a giriş kısmını anlatmaya çalıştım. Umarım bundan sonra WF 4.0 ile ilgili açıklayıcı makaleler yazabilirim.

C#’ta Method Parametreleri

Parametreler, bir değere atanan ya da bir methoda referans eden değişkenler için kullanılır. Method parametreleri, method çağırıldığında, asıl değerlerini argümanlardan alırlar. 4 çeşit parametre tipi bulunur; değer parametreleri (value parameters), referans parametreleri (reference parameters), çıktı parametreleri (output parameters) ve parametre dizileri (parameters arrays).

Değer parametreleri (value parameters), girdilerde parametre geçirilmelerinde kullanılır. Bir değer parametresi, methodlara geçirilen argümanların ilk değerlerini içeren yerel değişkenler ile uyuşur.

Değer parametrelerindeki değişiklikler, parametreye geçirilen argümanları etkilemezler.

Önemli: Değer parametrelerindeki değişiklik durumları, argümanları etkilemezler kelimeleri yanıltıcı olabilir çünkü türetilmiş sınıflar referans tip’te parametre içeriğini değiştirebilir. Parametre değerleri değiştiremez fakat referans edilmiş içerik (nesne) değiştirebilir.

Değer parametreleri seçimli olabilir, varsayılan değeri belirlemek için, böylece argümanlara ilişkilendirme yapılabilir.

Referans parametreleri, hem girdi (input) hem de çıktı (output) parametre geçişleri için kullanılır. Referans parametrelerini geçiş argümanları; bir değişken, yürütme süresinceki methodlar, ayrıca referans parametreleri argüman değişkenleri ile  aynı bellek bölgesini simgelerler. Bir referans parametresi ref anahtar sözcüğü ile gösterilir. Aşağıdaki örnek; ref anahtar sözcüğünün kullanımını gösterir.

class Test
{
static void Degistir(ref int x, ref int y)
{
int temp = x;
x =  y;
y = temp;
}
static void Main()
{
int i = 10, j = 20;
Degistir(ref i, ref j);
Console.WriteLine("{0} {1}", i, j); // Çıktı 20 10 olur.
}
}

Bu örneği ref anahtar sözcüksüz yazsaydık, çıktı “10 20” olurdu. Yani o değişkenlere referans vermeden bunların yerleri değiştirilemezdi.

Önemli: Referans parametreleri C# tarafından “referans ile geçiş” olarak adlandırılır; önce bir nesne örneğini bir methoda geçirir ve o method o nesne örneğine bir referans alır.

Referans parametreleri, çok küçük bir farkla “referans ile geçiş”’ten farklıdır. Bu durumda, referans bir değişkenin kendisindedir, bir nesne örneğinde değil. Eğer bu değişken, bir değer tipi içerirse bu tamamen normal bir durumdur. Bu değere “referans ile geçiş” yapılmamıştır değişken bu değeri tuttuğu sürece.

Referans parametrelerini düşünmenin iyi bir yolu, referans parametreleri, değişkenleri argümanlara geçiştirmek için bir takma ad’a dönüşürler şeklinde düşünmektir. Yukardaki örnekte, x ve i aslında aynı değişkendirler. Bellekte aynı bölgeye kaynak gösterirler.

Çıktı parametreleri (Output parameters), çıktı parametre geçişleri için kullanılırlar. Çıktı parametreleri referans parametrelerine benzerdir, fark olarak burada değeri ilk çağıran-sağlayan argüman önemsizdir. Çıktı parametreleri, out anahtar sözcüğü ile gösterilirler. Aşağıdaki örneği inceleyebiliriz;

using System;

namespace HelloWorld
{
class Test
{
static void Bolme(int x, int y, out int sonuc, out int kalan)
{
sonuc = x / y;
kalan = x % y;
}
static void Main()
{
int son, kal;
Bolme(20, 3, out son, out kal);
Console.WriteLine("{0} {1}", son, kal); // Çıktı 6 2 olur.
}
}
}

Önemli: CLR, direkt olarak sadece ref parametrelerini destekler. Out parametresi metadata içerisinde temsil edilir.

Parametre dizileri, bir methoda birden fazla sayıda argüman değişkeninin geçirilmesine izin verirler. Parametre dizileri, params anahtar sözcüğü ile gösterilirler. Bir methodun sadece son parametresi bir parametre dizisi olabilir ve parametre dizisinin tipi tek boyutlu dizi tipi olmak zorundadır. System.Console sınıfının Write ve Writeline methodları parametre dizilerinin kullanımına iyi bir örnektir. Bu iki method şu şekilde tanımlanmıştır:

 public class Console
{
public static void Write(string fmt, params object[] args) {...}
public static void WriteLine(string fmt, params object[] args) {...}
} 

Bu tür method tanımlamalarına, Visual Studio içerisinde methodun üzerine gelip sağ tıkladığımızda “Go to definition” sekmesiyle ulaşabiliriz. (Kısayol F12)

 

 

 

 

 

 

 

Parametre dizileri içeren bir method içerisinde, parametre dizileri bir dizi tipinin parametreleri ile tam olarak aynı şekilde davranır. Fakat, bir parametre dizisine sahip method, hem parametre dizisi tipindeki basit argümanı hem de parametre dizisindeki element tiplerinin argüman numaralarını geçirebilir. Sonrasında, bir dizi örneği otomatik yaratılır ve verilen argümanları ilişkilendirir. Örneğin;

 Console.WriteLine("x={0} y={1} z={2}", x, y, z); 

aşağıdaki koda eşdeğerdir

 string s = "x={0} y={1} z={2}";
object[] args = new object[3];
args[0] = x;
args[1] = y;
args[2] = z;
Console.WriteLine(s, args);

Önemli: Params anahtar sözcüğü kullanımının güzel bir tarafı da, opsiyonel bir kısayol oluşturmasıdır. Yani aşağıdaki şekilde bir kod yazmamızı önler:

 static object[] GetArgs() { ... }

static void Main()

{
object[ ] args = GetArgs();
object a = args[0];
object b = args[1];
object c = args[2];
Console.WriteLine("a={0} b={1} c={2}", a, b, c );
} 

Şimdi de bu methodu çağırıyorum ve compiler benim yerine bu parametreler için bir dizi oluşturuyor.

 static object[] GetArgs() { ... }

static void Main()

{
Console.WriteLine("a={0} b={1} c={2}", GetArgs() );
} 

Fakat bu günlerde, .NET içerisinde sadece çok az method bir dizi geriye döndürüyor. Bu nedenle bir çok yazılımcı, IEnumerable<T> kullanmayı esneklik amacıyla tercih ediyorlar. Bu nedenle ileride şöyle bir kod yazabilirsiniz;

 static IEnumerable<object> GetArgs { }

static void Main()
{
Console.WriteLine("x={0} y={1} z={2}", GetArgs().ToArray());
}