Skip to content

Commit 04789d4

Browse files
committed
Added chapter 02 code samples.
1 parent 2a5db2a commit 04789d4

9 files changed

+300
-3
lines changed
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
</PropertyGroup>
8+
9+
</Project>

Azon.WeatherLib/Reporter.cs

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace Azon.WeatherLib
2+
{
3+
/*
4+
Bir sınıf kütüphanesi içerisinde anlamsal bütünlüğü bozmadan istediğimiz kadar tip ve tip üyesi ekleyebiliriz.
5+
*/
6+
public class Reporter
7+
{
8+
public string GetSummary(string city,Temperature temperature)
9+
{
10+
return string.Empty;
11+
}
12+
}
13+
}

Azon.WeatherLib/Temperature.cs

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
namespace Azon.WeatherLib
2+
{
3+
/*
4+
Class Library'ler execute edilebilen assembly'lar değildir. Console uygulamalarının aksine.
5+
Diğer projelerin referans ederek kullanabileceği fonksiyonellikler, türleri vs barındırırlar.
6+
7+
Temperature sınıfındaki amaç hava sıcaklık değerini taşıyan bir veri yapısı sağlamaktır.
8+
Sahip olması gereken işlevler. Fahrenheit to Celcius vice versa.
9+
10+
11+
Öneri Senaryo : Belli sıcaklık değerlerine göre bir state bildirimi (Ilık, Serin, Sıcak, Nemli)
12+
*/
13+
public struct Temperature
14+
{
15+
public double Value { get; set; }
16+
public TemperatureType Type { get; set; }
17+
public Temperature(double value, TemperatureType type)
18+
{
19+
Value = value;
20+
Type = type;
21+
}
22+
23+
public void ConvertToCelcius()
24+
{
25+
// Early Return
26+
// Yani kod akışından erken dönülebilme olasılığı varsa uygulayalım.
27+
if (Type == TemperatureType.Celcius)
28+
return;
29+
30+
Type = TemperatureType.Celcius;
31+
Value = (Value - 32) * 5.0 / 9.0;
32+
}
33+
public void ConvertToFahrenheit()
34+
{
35+
if (Type == TemperatureType.Celcius)
36+
{
37+
Type = TemperatureType.Fahrenheit;
38+
Value = (Value * 9.0 / 5.0) + 32;
39+
}
40+
}
41+
42+
//public double ConvertToCelcius()
43+
//{
44+
// // Early Return
45+
// // Yani kod akışından erken dönülebilme olasılığı varsa uygulayalım.
46+
// if (Type == TemperatureType.Celcius)
47+
// return Value;
48+
49+
// Type = TemperatureType.Celcius;
50+
// return (Value - 32) * 5.0 / 9.0;
51+
52+
// //if (Type == TemperatureType.Fahrenheit)
53+
// //{
54+
// // Type = TemperatureType.Celcius;
55+
// // return (Value - 32) * 5.0 / 9.0;
56+
// //}
57+
// //return Value;
58+
//}
59+
60+
//public double ConvertToFahrenheit()
61+
//{
62+
// if (Type == TemperatureType.Celcius)
63+
// {
64+
// Type = TemperatureType.Fahrenheit;
65+
// return (Value * 9.0 / 5.0) + 32;
66+
// }
67+
// return Value;
68+
//}
69+
public override string ToString()
70+
{
71+
return $"{Value} ({Type})";
72+
}
73+
}
74+
public enum TemperatureType
75+
{
76+
Celcius,
77+
Fahrenheit
78+
}
79+
}

Chapter01/Program.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Örneğin Console sınıfının WriteLine metodu statik bir fonksiyondur.
2525
private static void Main(string[] args)
2626
{
2727
Console.Beep();
28-
Console.WriteLine("Hello, World!");
28+
Console.WriteLine("Hello, World!"); // WriteLine ve Beep, Console sınıfının statik metotlarıdır. Nesne örneğine ihtiyaç duymayan metotalar.
2929

3030
string fullName = "Burak Selim Şenyurt";
3131
string repoAddress = "https://github.com/buraksenyurt/ProgrammingWithCSharp";

Chapter02/Chapter02.csproj

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net8.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<ProjectReference Include="..\Azon.WeatherLib\Azon.WeatherLib.csproj" />
12+
</ItemGroup>
13+
14+
</Project>

Chapter02/Program.cs

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Azon.WeatherLib;
2+
using Chapter02.UI.View;
3+
4+
namespace Chapter02
5+
{
6+
internal class Program
7+
{
8+
static void Main()
9+
{
10+
/*
11+
Temperature veri yapısı Azon.WeatherLib kütüphanesi içinde yer almaktadır.
12+
Temperature sınıfı object instance formasyonunda kullanılır. Yani önce new ile bir örnek oluşturulur.
13+
Sonra bu örneğin erişilebilir olan üyeleri(metotlar gibi) kullanılır.
14+
*/
15+
var currentWeatherValue = new Temperature(21, TemperatureType.Celcius);
16+
Console.WriteLine(currentWeatherValue);
17+
currentWeatherValue.ConvertToFahrenheit();
18+
Console.WriteLine(currentWeatherValue);
19+
20+
Terminal.SplashScreen("Super Mario");
21+
Terminal.ShowMenu();
22+
Terminal.GetUserInput();
23+
}
24+
}
25+
}

Chapter02/UI/View/Terminal.cs

+145
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
namespace Chapter02.UI.View
2+
{
3+
/*
4+
Terminal aslında kullanıcı ile etkileşimde olunan bir ortam. Genel olarak View olarak ifade edilir.
5+
Bu uygulamanın UI(User Interface) ile ilgili işlerinin toplandığı, View alanı altında konuşlandırılmıştır.
6+
7+
Burada en zoru hangi türü hangi isim alanı(namespace) altına alacağımıza karar vermektir. Bu anlamda genel yazılım
8+
prensipleri ve pratikleri var. Örneğin MVC (Model View Controller) veya MVVM (Model View View Model)
9+
10+
Terminal sınıfının fonksiyonları sadece Console ile çalışır halde. Genel olarak Terminal ile Console sınıfı arasında sıkı bağlı
11+
bir ilişki olduğunu söyleyebiliriz (Thightly Coupled) OOP tarafında mümkün mertebe nesneler arası bağımlılıkları azaltmaya çalışırız.
12+
Buda Losely Coupled olarak geçer. Yani amaç Terminal sınıfının sadece Console ile çalışması değil örneğin bir IoT terminali ile de
13+
çalışması olabilir.
14+
15+
Arada gelen soru üzerine sonrası için bakmamız gereken ilkeler;
16+
SOLID
17+
Single Responsibility
18+
Open Closed
19+
Liskov Substituation
20+
Interface Segregation
21+
Dependency Inversion
22+
23+
Terminal sınıfının tüm üyeleri static olarak tanımlandığından kendisinin de static olması önerilir.
24+
*/
25+
internal static class Terminal
26+
{
27+
/*
28+
SplashScreen herhangibir parametre almayan ve değer döndürmeyen (void) bir metottur.
29+
Main metodu static tanımlanmış bir metot olduğundan, Program sınıfı içindeki SplashScreen metodunun
30+
çağırlabilmesi için onun da static tanımlanması gerekir.
31+
32+
Bir metodu, parametre yapısını farklılaştırarak çoğaltabilir ve aynı isimle kullanabiliriz(Overloading)
33+
Overloading işleminde kural parametre sayısı ve türleri ile alakalıdır(Method Signature)
34+
35+
Eğer aksini belirtmezsek, sınıf üyeleri private erişim belirleyicisine sahiptir (Access Modifiers)
36+
private, public, internal, protected ve protected internal şeklinde 5 temel erişim belirleyicisi vardır.
37+
38+
internal erişim belirleyici sadece tanımlı olduğu proje için kullanımı serbest bırakır.
39+
public ise her yerden erişilebilir anlamındadır.
40+
41+
Aynı/benzer amaca hizmet eden tipleri (class, struct, enum, interface, delegate) aynı namespace çatısında toplamak
42+
veya aynı/benzer amaca hizmet eden üyeleri/members (field, property, method, event, constructor...) aynı tip altında
43+
toplamak, domain anlamında bütünsellik sağlamak için önemlidir.
44+
Örneğin, terminal ekranı ile ilgili yapılacak işleri Terminal isimli bir sınıf altında topladığımız gibi.
45+
*/
46+
internal static void SplashScreen()
47+
{
48+
Console.ForegroundColor = ConsoleColor.Yellow;
49+
Console.WriteLine("************************");
50+
Console.WriteLine("***Wellcome Stranger****");
51+
Console.WriteLine("************************");
52+
Console.ForegroundColor = ConsoleColor.White;
53+
}
54+
internal static void SplashScreen(string playerName)
55+
{
56+
Console.ForegroundColor = ConsoleColor.Yellow;
57+
// Console.WriteLine(new String('*', 24));
58+
Console.Write(GetSmartText('+', 24));
59+
Console.WriteLine("Wellcome {0}", playerName);
60+
Console.WriteLine(new string('*', 24));
61+
Console.WriteLine();
62+
Console.ForegroundColor = ConsoleColor.White;
63+
Console.ReadLine();
64+
}
65+
internal static void ShowMenu()
66+
{
67+
Console.Clear();
68+
Console.WriteLine("Başlat(B)");
69+
Console.WriteLine("Puan Tablosu(P)");
70+
Console.WriteLine("Ayarlar(A)");
71+
Console.WriteLine(GetSmartText('_', 24));
72+
Console.WriteLine("Çıkış(E)");
73+
Console.WriteLine("Bir seçim yapar mısın?");
74+
}
75+
76+
internal static void GetUserInput()
77+
{
78+
/*
79+
Terminal ekranından girdi almanın bir yolu ReadLine metodunu kullanmaktır.
80+
81+
B, A, E, P gibi harfler hiç bilmeyen için bu oyunda neyi ifade ediyor acaba?
82+
83+
*/
84+
var input = Console.ReadLine();
85+
var userInput = input.ToUpper();
86+
switch (userInput)
87+
{
88+
case "B":
89+
Console.WriteLine("Oyun başlıyor...");
90+
break;
91+
case "P":
92+
// Score tablosu çizilen bir metot çağrılır örneğin
93+
Console.WriteLine("Puan Tablosu");
94+
break;
95+
case "A":
96+
// Ayarlar menüsü gösterilir vs
97+
Console.WriteLine("Ayarlar");
98+
break;
99+
case "E":
100+
Console.WriteLine("Oyun sonlandırılıyor");
101+
break;
102+
default:
103+
Console.WriteLine("Seçimini anlayamadım. Lütfen tekrar gel!");
104+
break;
105+
}
106+
107+
//if (userInput == "B")
108+
//{
109+
// Console.WriteLine("Oyun başlıyor...");
110+
//}
111+
//else if (userInput == "P")
112+
//{
113+
// Console.WriteLine("Puan Tablosu");
114+
//}
115+
//else if (userInput == "A")
116+
//{
117+
// Console.WriteLine("Ayarlar");
118+
//}
119+
//else if (userInput == "E")
120+
//{
121+
// Console.WriteLine("Oyun sonlandırılıyor");
122+
//}
123+
//else
124+
//{
125+
// Console.WriteLine("Seçimini anlayamadım. Lütfen tekrar gel!");
126+
//}
127+
}
128+
129+
/*
130+
GetSmartText metodu parametrelere göre bir string üretip döndürür.
131+
*/
132+
static string GetSmartText(char c, int count)
133+
{
134+
string result = string.Empty; // Geriye bir string döneceği için başlangıçta tanımladık.
135+
// count sayısı kadar ileri hareket edecek bir döngü başlattık
136+
//TODO@everyone for döngüsü yerine while, do while döngüleri ile aynı işi yapar mısınız?
137+
for (int i = 0; i < count; i++)
138+
{
139+
result += c; // String'e += ile c argümanını ekledik
140+
}
141+
result += "\n"; // Newline karakteri de ekledik. new line, tab gibi karakterler Escape Character olarak ifade edilip \ ile yazılır.
142+
return result;
143+
}
144+
}
145+
}

ProgrammingWithCSharp.sln

+13-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
1010
EndProject
1111
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Chapter01", "Chapter01\Chapter01.csproj", "{2EB417F4-E20F-40F0-B186-41CB8A126788}"
1212
EndProject
13-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chapter00", "Chapter00\Chapter00.csproj", "{A9F9401A-5C7E-4829-9EEC-CD2CE0786575}"
13+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Chapter00", "Chapter00\Chapter00.csproj", "{A9F9401A-5C7E-4829-9EEC-CD2CE0786575}"
14+
EndProject
15+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chapter02", "Chapter02\Chapter02.csproj", "{796B200C-7ACD-485F-BDD0-71E3AE9FFBD1}"
16+
EndProject
17+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azon.WeatherLib", "Azon.WeatherLib\Azon.WeatherLib.csproj", "{11B73CC5-FB3F-488D-B554-C1D076E0B75F}"
1418
EndProject
1519
Global
1620
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -26,6 +30,14 @@ Global
2630
{A9F9401A-5C7E-4829-9EEC-CD2CE0786575}.Debug|Any CPU.Build.0 = Debug|Any CPU
2731
{A9F9401A-5C7E-4829-9EEC-CD2CE0786575}.Release|Any CPU.ActiveCfg = Release|Any CPU
2832
{A9F9401A-5C7E-4829-9EEC-CD2CE0786575}.Release|Any CPU.Build.0 = Release|Any CPU
33+
{796B200C-7ACD-485F-BDD0-71E3AE9FFBD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
34+
{796B200C-7ACD-485F-BDD0-71E3AE9FFBD1}.Debug|Any CPU.Build.0 = Debug|Any CPU
35+
{796B200C-7ACD-485F-BDD0-71E3AE9FFBD1}.Release|Any CPU.ActiveCfg = Release|Any CPU
36+
{796B200C-7ACD-485F-BDD0-71E3AE9FFBD1}.Release|Any CPU.Build.0 = Release|Any CPU
37+
{11B73CC5-FB3F-488D-B554-C1D076E0B75F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
38+
{11B73CC5-FB3F-488D-B554-C1D076E0B75F}.Debug|Any CPU.Build.0 = Debug|Any CPU
39+
{11B73CC5-FB3F-488D-B554-C1D076E0B75F}.Release|Any CPU.ActiveCfg = Release|Any CPU
40+
{11B73CC5-FB3F-488D-B554-C1D076E0B75F}.Release|Any CPU.Build.0 = Release|Any CPU
2941
EndGlobalSection
3042
GlobalSection(SolutionProperties) = preSolution
3143
HideSolutionNode = FALSE

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Senaryo Kodları : Y -> Yellow, O -> Orange, R -> Red
9292
| **Y01** | Value Type Tasarlaması(Struct) | Geliştirmekte olduğumuz iki boyutlu oyunda Vektör değerlerini tutmak istiyoruz. Bunun için bir struct tasarlamanız bekleniyor. | Struct 2 boyutlu düzlemde mutlaka x ve y değerlerini taşımalı. double veri türü kullanılmalı. Bir vektörü birim vektöre dönüştüren, vektör bükülüğünü hesap eden en az iki metot yazılmalı|
9393
| **Y02** | Terminal ile Çalışmak| Bu çalışmada bir Console uygulaması oluşturup ekrana en sevdiğiniz çizgi roman/kitap karakterinin bilgilerini yazdırmanız bekleniyor. | Karaktere ait tüm bilgiler öncelikle ayrı değişkenlerde toplanmalı. string, double, char, bool, uint veri türleri mutlaka kullanılmalı. Bilgileri ekrana yazdırma operasyonunu bir metot üstlenmeli |
9494
| **Y03** | Enum Türü Kullanımı | Bir web uygulamasının backend tarafında kodlama yapıyorsunuz. İş kurallarını işleten bazı fonksiyonlar HTTP durum kodları ile çalışıyor. HTTP durum kodlarının sayısal anlamlarını bir Enum sabiti olarak tanımlamanız bekleniyor. | Enum sabiti HTTP durum kodlarından en az 5ini karşılamalı. Uygulama kodunda Enum değerine göre ekrana bilgilendirme yapmamızı sağlayacak string türden değer döndüren bir metot bulunmalı. |
95-
| **Y04** | | | |
95+
| **Y04** | Metot Kullanımları | Termianale farklı desenelerde çıktılar veren bir metot geliştirmemiz isteniyor. Örneğin "Merhaba Dünya!" için "m_e_r_h_a_b_a d_ü_n_y_a_!" yazması vb | Parametre olarak stili değiştirilecek string değer alan ve geriye string değer döndüren bir metot olması bekleniyor. Metot parametre olarak nasıl bir formatta çıktı hazırlayacağını da argüman olarak alabilir. |
9696
| **Y05** | | | |
9797
| **Y06** | | | |
9898
| **Y07** | | | |

0 commit comments

Comments
 (0)