در صورتی تا به امروز به پیشنهادهای مکرر ما در باب تمرین کردن کدنویسی گوش کرده باشید، فعلا احتمالاً توانستهاید یک نرمافزار نسبتاً عالی بسازید؛ ولی در شرایطی که زمان هنگامی از تایپ کردن کد بگذرد و مجدد به آن مراجعهنمایید، ممکن میباشد متوجه گردید که بعضی قسمتهای آن و منطقش را فهم نمی کنید. طراحی اپلیکیشن در مشهد این شرایط وقتی که جدید آغاز به اپنویسی کردهاید، به طور کاملً طبیعی میباشد. ممکن میباشد بارها از این که کدی که 5 دقیقه پیش نوشتید را فراموش کردهاید، در گیر هراس بشوید؛ ولی مکان نگرانی وجود ندارد، این واقعه برای اکثر اوقات برنامه نویس ها میفتد. خبر عالی این میباشد این موقعیت در زمان مجال بهبود مییابد و واحد سنجش ارتفاع کشیدن آن به ترازو تمرین کدنویسی شما بستگی دارااست. به عنوان مثال بعضا برنامه نویس ها به مدتی نزدیک به 6 ماه کدنویسی مداوم به طور صبح تا شب نیاز داراهستند تا بهاین پروسه عادت نمایند. بدین ترتیب یک توشه دیگر تأکید می کنیم که تمرین مداوم کدنویسی و تفحص و یادگرفتن، کلید حل اشتباهات می باشند.
ساختار کد
بعضا اشخاص تصور مینمایند که در گویش اپنویسی سوئیفت نکته خاصی در زمینهی ساختار کد نمیقدرت اعلامکرد. هر کسی عادتها و مدل کدنویسی خاص خویش را داراست و هیچ چیز استانداردی نیست. ما نیز قصد نداریم درین مقاله به استانداردسازی ساختار کد سوئیفت بپردازیم، بلکه میخواهیم این ساختار را پرنورخیس کنیم. بنابراین هر آن چه را تا به امروز آموختهایم کنار هم قرار میدهیم تا یک نقطه شروع برای شعور طرز سازماندهی کد و درکم آسودهخیس مسائل متعدد در طی مراجعات آتی به کد خودمان بیابیم.
فیلم فراگیری نرمافزار نویسی سوئیفت – اپ نویسی iOS با Swift در فرادرس
کلیک نمائید
درپی اجزای گوناگون یک نرم افزار را که در پوشههای سوئیفت اکران می یابد، از دیدی سطح بالا آیتم نظارت قرار میدهیم.
کلاسها، پروتکلها و اکستنشنها
این موردها به صورت انحصاری نهادهایی سطح بالا میباشند. خواسته از سطح بالا این میباشد که در آکولادها محدود نشدهاند و به صورت بی واسطه در خویش فولدر قرار می گیرند.
struct-ها و enum-ها
این موردها حدوداً ارگانهای سطح بالا محسوب می شوند، ولی آنانرا میاقتدار داخل struct-ها و enum-های دیگر نیز قرار بخشید.
تابعها
تابعها میتوانند شیءهای سطح بالا باشند؛ البته این موقعیت فقطً در نرم افزارهای کنسول سفارش می شود. در خصوص نرمافزارهای macOS ،iOS و watchOS عالی میباشد که همواره تابعها را باطن کلاسها محافظت کنیم.
اثباتها و متغیرها
این مورد ها می بایست در تحتترین سطح ممکن اعلان شوند و مضمون این کلام آن میباشد که در حالتی که یک متغیر قرار میباشد داخل یک جمله if مصرف شود، بایستی تنهاً باطن آن اعلان گردیده باشد. در شرایطیکه یک متغیر قرار میباشد مجموعاَ پوشه استعمال شود، آن را میقدرت در اولِ فولدر اعلان کرد تا در دست گرفتن دسترسی قابل قبولی داشته باشد.
بهدنبال مثالی ارائه می کنیم تا همگی آنچه گفته شد را بوسیله شیوه عملی طرحبندی مورد ها گوناگون در یک فولدر اکران دهیم. این نمونه بر مبنای یک قطعه کد View Controller میباشد که در تمامی پوشههای نو در اختیار گرفتن نما قرار میگیرد.
1// Comments regarding author, application, date of creation
2// copyright info and a brief synopsis of what this Swift file does
3//MARK: My Global and File Constants
4public static let myGlobalConstant: String = \"Place constants here\"
5fileprivate var myFileConstantCounter: Int = 1
6
7
8//MARK: - Enums
9enum myEnum { }
10enum myOtherEnum {}
11
12
13//MARK: - Protocols
14protocol myProtocol {}
15protocol myOtherProtocol {}
16
17
18//MARK: - Home Details
19struct myHouse {
20 // myHouse properties and functions for later use
21}
22
23
24//MARK: - View Controller
25class ViewController: UIViewController {
26
27 //MARK: - Properties
28
29 @IBOutlet weak var myLabel: UILabel!
30
31 let myClassConstant = \"Default Text\"
32 let myReasoningForTheSpaces = \"Spaces help separate variables logically by use, if I need to change an initial value I know where to look\"
33
34 var myClassVariable: String = \"I declare constants before variables, but keep them grouped together\"
35 var session: URLSession = URLSession.default
36
37
38 //MARK: - View Life Cycle
39
40 override func viewDidLoad() {
41 // set up the session variable here
42 }
43
44 override func viewWillAppear() {
45 // start drawing objects needed for view here
46 // also set up animations that should load with the view
47 }
48
49
50 //MARK: - Helper Methods
51
52 func getUserInfo() {
53 ...
54 }
55
56
57 //MARK: - Private Methods
58
59 private func updateInfo() {
60 myClassVariable = \"I use private methods to perform work
61 that would only be used by the class it is declared in\"
62 }
63
64
65 //MARK: Actions
66
67 @IBAction func buttonPressed(_ sender: UIButton) {
68 // handle the event initiated by the user
69 }
70}
71
72
73//MARK: - Extensions
74//MARK: URLSession
75extension ViewController: URLSessionDataDelegate {
76 // ... URLSession Data Delegate Methods
77}
78
79extension ViewController: URLSessionTaskDelegate {
80 // ... URLSession Task Delegate methods
81}
82
83
84//MARK: - View Controller Protocols
85extension ViewController: myProtocol {
86 // add default implementation specific to ViewController
87}
88
89extension ViewController: myOtherProtocol {
90 // add default implementation specific to ViewController
91}
92
93
94//MARK:- Protocols
95extension myProtocol {
96 //add default implementation where used
97}
98
99extension myOtherProtocol {
100 //add default implementation where used
101}
مشاهده بدون نقص کدها
خوانایی
خوانایی هم به مراد یاری به فهم کد از سوی خویش بسطدهنده و هم اشخاص دیگر بسیار اساسی میباشد. شما بایستی غایت کوشش خویش را بکنید تا خوانایی قابل قبولی در تمامی کدهایتان داشته باشید.
تقسیم کردن کلیه چیز
همانگونه که می بینید زمانی قرار میباشد کارکردهای مختلفی را ساخت و ساز کنیم، فولدرهای اپ به طور کاملً وقت گیر میشوند. براین اساس بایستی آنهارا در یک مجموعه فایل به فولدرهای متفاوت تقسیم کنیم. تفاهم نامه نامگذاری که معمولاً بهاین خواسته به کار گیری می گردد به طور پایین میباشد:
ViewController+NameOfDelegate.swift
یا این که
ViewController+NameOfDataSource.swift
به این ترتیب خواهیم توانست متوجه بشویم که چه اجزایی را بایستی در کدام پوشهها در اختیار بگذاریم و می توانیم مطمئن باشیم که کد فقطً دربرگیرنده آن جزئی میباشد که قرار میباشد باشد.
با به کارگیری از مثالی که در نصیب فوق مطرح کردیم، در پی سعی می کنیم که enum-ها را غیر وابسته کرده و آنان را در پوشه اختصاصی خویش در اختیار بگذاریم. در حالتی که کارایی کنیم فایلی به اسم Enums.swift برای enum-های سراسری بسازیم، به دنبال میتوانیم با استعمال از //MARK: آن را به نصیبهای متعدد تقسیم کنیم تا در بهروزرسانیهای آتی به راحتی بتوانیم به آن بازگردیم. در صورتی enum-ها در فولدر فقط بهاین کنترلر ویو مرتبط باشند، در اختیار گرفتن دسترسی را طوری تهیه میکنیم که به طور داخلی باشد؛ البته فایلی را زیر به عبارتی مجموعه به اسم کلاس ViewController تولید میکنیم.
ما خواهیم توانست پروتکلها و اکستنشنهای آنانرا نیز گزینش کرده و در پوشههای غیروابسته خویش در اختیار بگذاریم؛ مگر این که پروتکل در سبک تمجید گردیده باشد و در اینحالت در کلاسهای دیگر قابل به کار گیری وجود ندارد. چنانچه پروتکل دارنده یک اکستنشن خاص کلاس یا این که struct باشد می بایست از //MARK: برای جداسازی منطقی آن ها در پوشه Protocols.swift بکنیم. در این زمینه نیز فولدرها را به به عبارتی ترتیبی که در امر Enums.swift فعالیت کردیم، قرار می دهیم.
به دنبال struct را نیز قطع می کنیم و آن را تحت عنوان یک سبک به اسم House در فایلی به اسم House.swift قرار می دهیم. همینطور آن را در یک دسته مختلف به اسم Models قرا میدهیم، چون یک سبک برای منزل محسوب میشود.
کلاس و کلیه متدهای آن نیز میتوانند کنار هم بمانند؛ البته بایستی اکستنشنهای خاص کلاس را مستقل کرده و در پوشه جدیدی به اسم ViewController+Extensions.swift در اختیار بگذاریم. دراین باره کافی میباشد مطمئن شویم که همگی متدهای ما در ViewController.swift که می بایست از سوی یک اکستنشن فراخوانی شوند به طور internal تهیه گردیدهاند، زیرا حالتهای private و fileprivate جلوی دیدن متدهایی که در یک اکستنشن پوشه دیگر قرار دارا هستند را میگیرند.
اثباتها موقعیت خاصی داراهستند. یک ترفندی که اکثر اوقات اشخاص به کار گیری مینمایند، این میباشد که یک فولدر Constants.swift می سازند و کلیه اثباتهایی را که در سراسر نرم افزار به کار گیری شود در آن قرار می دهند. بنابراین چنانچه یک URL که موردنیاز نرم افزار میباشد تغییر تحول یابد، صرفا کافی میباشد آن را در یک جا تغییر تحول دهید و براین اساس جای آن را بیپندار میشناسیم. در این حالت در صورتیکه از آن در 5 مکان متعدد استعمال کرده باشید، این محلها میتوانند همچنان به فولدر اثباتها ارجاع داشته باشند و می توانید مطمئن باشید که همگی چیز بهروزرسانی گردیدهاست. یک تغییرو تحول در قبال پنج تغییرو تحول، معامله نیکی به لحاظ میرسد.
1//Contants.swift
2// This file contains all constants used by my app
3struct SomeWebAPI {
4 static let myURL: String = \"http://api.contoso.com\"
5}
6
7// Call it later like this
8let url = URL(string: SomeWebAPI.myURL)!
9
10// or safely using
11if let url = URL(string: SomeWebAPI.myURL) {
12 // do stuff with URL
13}
به کارگیری از اسمهای بیان کننده برای متغیرها
اکثر اوقات اشخاص با دقت به سوابق کدنویسی در گویشهای C و ++C معمولاً از اسمهای تکحرفی برای متغیرها به کار گیری مینمایند کهاین موقعیت باعث به درهمریختگی کد و ناخوانایی آن میگردد. این یک خط مش نامناسب محسوب میشود و نباید از آن به کار گرفت. در حین سالها، حروف i ،j ،k ،l ،m ،n ،t ،x ،y و z چنان معانی متفاوت در دور و برهای اپنویسی داشتهاند که اکنون نسبتاًً هیچ معنا خاصی به ذهن متبادر نمیکنند. فرض فرمائید اپلیکیشنای نوشتهاید که با به کارگیری از سرعت معدل در حین زمان وقتی خاص، فاصله پیموده گردیده را با متغیرهای j ،k و m به حساب آوردن مینماید. اسامی این متغیرها هیچ سرنخی به ما نمیدهد و مگر اعجازای فیس بدهد که بتوانیم بفهمیم k در معنای متغیر سرعت میباشد.
در واقع فارغ از پژوهش ظریف کد و طریق تایپ کردن فرمولها، قابلیت این که بفهمیم متغیر سرعت با به کار گیری از k آیتم ارجاع قرار گرفته قابلیتپذیر وجود ندارد. به این ترتیب دیگر نمیتوانیم با نگاهی سریع به یک قطعه کد متوجه شویم که سرعت کجا رقم خورده میباشد و دراین حالت خوانایی کد هم برای خویش ما و هم اپلیکیشننویسان دیگر کاهش می یابد.