ความรู้เบื้องต้นเกี่ยวกับการเขียนโปรแกรมเชิงวัตถุใน MATLAB (2023)

Table of Contents
ตัวอย่างการใช้งาน: การวิเคราะห์ข้อมูลอาร์เรย์เซนเซอร์ การตรวจสอบรายการข้อมูลและการดำเนินการ การแสดงข้อมูลด้วยคุณสมบัติของคลาส การสร้างวัตถุและการเข้าถึงคุณสมบัติ การตรวจสอบข้อผิดพลาด การควบคุมการเข้าถึงข้อมูล การนำการดำเนินการไปใช้ด้วยวิธีการแบบคลาส การระบุวิธีการสร้าง การใช้วิธีการเฉพาะของแอปพลิเคชัน วิธีการโทร การเข้าถึงคุณสมบัติด้วยวิธีรับและตั้งค่า การระบุเมธอดสำหรับฟังก์ชัน MATLAB ที่มีอยู่ด้วยการโอเวอร์โหลด การพัฒนาแอปพลิเคชันต่อไป ผลิตภัณฑ์ที่ใช้ เรียนรู้เพิ่มเติม ดูบทความสำหรับความสามารถที่เกี่ยวข้อง ดูบทความสำหรับอุตสาหกรรมที่เกี่ยวข้อง Videos

โดย Stuart McGarrity และ Adam Sifounakis, MathWorks

เมื่อสร้างแอปพลิเคชันซอฟต์แวร์ สิ่งสำคัญคือต้องจัดระเบียบบล็อกส่วนประกอบต่างๆ ของซอฟต์แวร์ของคุณให้เป็นกลุ่มที่เกี่ยวข้องกัน ตัวอย่างเช่น ตัวแก้ตัวเลขแบบกำหนดเองอาจต้องการพารามิเตอร์การกำหนดค่าและรูทีนหลายตัวเพื่อทำการคำนวณทั้งชุด การเขียนโปรแกรมเชิงวัตถุ (OOP) ช่วยให้คุณสามารถจัดกลุ่มพารามิเตอร์คอนฟิกูเรชัน (คุณสมบัติ) ของตัวแก้ปัญหาพร้อมฟังก์ชัน (เมธอด) ให้เป็นคำจำกัดความเดียว หรือระดับ. ทุกสิ่งที่ผู้ใช้จำเป็นต้องใช้เพื่อดำเนินการแก้ปัญหานี้จะถูกกำหนดไว้ในคลาสนี้

วัตถุคือตัวอย่างของการเรียน. เมื่อโปรแกรมดำเนินการ วัตถุจะถูกสร้างขึ้นตามคำจำกัดความของคลาสและทำงานในลักษณะที่กำหนดโดยคลาส คุณสมบัติของวัตถุแสดงถึงสถานะและวิธีการเป็นตัวแทนของการกระทำทั้งหมดที่ผู้ใช้อาจดำเนินการ ด้วยวิธีนี้ ผู้เขียนโค้ดสามารถจัดกลุ่มข้อมูลและฟังก์ชันที่เกี่ยวข้องทั้งหมดสำหรับระบบซอฟต์แวร์ได้อย่างง่ายดาย และผู้ใช้สามารถค้นหาและใช้ความสามารถทั้งหมดที่ผู้เขียนโค้ดได้พัฒนาขึ้นได้อย่างง่ายดาย

ตัวอย่างต่อไปนี้ใช้การเขียนโปรแกรมเชิงวัตถุเพื่อสร้างแอปพลิเคชันที่จะวิเคราะห์ข้อมูลเซ็นเซอร์จากอาร์เรย์ของเซ็นเซอร์

ตัวอย่างการใช้งาน: การวิเคราะห์ข้อมูลอาร์เรย์เซนเซอร์

อาร์เรย์เซนเซอร์ (รูปที่ 1) คือชุดของเซนเซอร์ ซึ่งมักจัดเรียงเป็นเส้น ซึ่งใช้ในการสุ่มตัวอย่างสื่อ เช่น อากาศ น้ำ หรือพื้นดินสำหรับเรดาร์ โซนาร์ หรือการสื่อสารผ่านเซลลูล่าร์ ด้วยการรวบรวมตัวอย่างเวลาจากหลายจุดในอวกาศ คุณสามารถดึงข้อมูลเพิ่มเติมจากสื่อที่กำลังสุ่มตัวอย่างได้

รูปที่ 1 อาร์เรย์เซ็นเซอร์ตรวจจับแหล่งกำเนิดแม่เหล็กไฟฟ้าที่อยู่ห่างไกลสองแหล่งในมุมที่ไม่รู้จัก

แอปพลิเคชันของเราใช้อาร์เรย์เซ็นเซอร์เพื่อระบุทิศทางการมาถึง (DOA) ของแหล่งกำเนิดแม่เหล็กไฟฟ้าที่อยู่ห่างไกลหลายแห่ง เช่น สัญญาณวิทยุและเครื่องส่งสัญญาณเรดาร์ ในสถานการณ์สมมตินี้ เราจะพยายามประมาณค่ามุม θ1 และ θ2 ของแหล่งที่มาทั้งสองที่สัมพันธ์กับทิศทางที่อาร์เรย์เซนเซอร์ชี้ไป

การตรวจสอบรายการข้อมูลและการดำเนินการ

สำหรับแอปพลิเคชันนี้ เราจะต้องจัดเก็บและแสดงข้อมูลต่อไปนี้:

(Video) ใช้กระดาษสอน Class กับ Object คืออะไร ต่างกันยังไง ใครไม่รู้เข้ามาดู

  • จำนวนเซ็นเซอร์และตัวอย่าง
  • ข้อมูลเซ็นเซอร์ตัวอย่าง
  • อัตราตัวอย่างเซ็นเซอร์
  • ระยะห่างของเซ็นเซอร์
  • ความยาวคลื่นของแหล่งกำเนิดที่ห่างไกล
  • ความเร็วของคลื่น
  • ชื่อชุดข้อมูลเซนเซอร์หรือคำอธิบาย

เราจะใช้เทคนิคการแปลงฟูริเยร์แบบเร็วอย่างง่าย (FFT) เพื่อประมาณค่า DOA ของแหล่งที่มา เทคนิคนี้สามารถแบ่งออกเป็นส่วน ๆ และนำไปใช้เป็นชุดของการดำเนินการ จะมีการดำเนินงานด้านสาธารณูปโภคจำนวนเล็กน้อยเพื่อช่วยให้งานพัฒนาง่ายขึ้น ตัวอย่างเช่น เราต้อง:

  • สร้างชุดข้อมูลจากข้อมูลสังเคราะห์หรือข้อมูลสดที่ได้มา
  • ตรวจสอบและแก้ไขค่าชุดข้อมูลและพารามิเตอร์
  • ลงจุดข้อมูลตัวอย่างเพื่อช่วยในการตีความและตรวจสอบความถูกต้อง
  • คำนวณและลงจุดสเปกตรัมกำลังของชุดข้อมูล (โดยใช้ขนาดกำลังสองอย่างง่ายของวิธี FFT)
  • ค้นหาจุดสูงสุดของสเปกตรัมพลังงานเพื่อประเมิน DOA ของแหล่งที่มา

เมื่อระบุข้อมูลที่เราต้องการแสดงและกิจกรรมที่เราต้องดำเนินการแล้ว เราสามารถแสดงข้อมูลด้วยคุณสมบัติคลาสและกิจกรรมด้วยเมธอดคลาส

การแสดงข้อมูลด้วยคุณสมบัติของคลาส

เราเริ่มต้นด้วยการกำหนดคลาสเพื่ออธิบายอาร์เรย์เซ็นเซอร์ การแสดงเริ่มต้นนี้มีเฉพาะรายการข้อมูลและแสดงเป็นคุณสมบัติของคลาส

คุณกำหนดคลาสใน MATLAB ด้วยไฟล์นิยามคลาส ซึ่งขึ้นต้นด้วยคลาสเดฟคำหลักและถูกยกเลิกโดยจบคำสำคัญ. ภายในบล็อกคำนิยามคลาส บล็อกคำหลักเพิ่มเติมจะอธิบายลักษณะต่างๆ ของคลาส เช่น คุณสมบัติของคลาสและเมธอดของคลาส ไฟล์คำจำกัดความที่แสดงในรูปที่ 2 อธิบายถึงคลาสเศร้า(ชุดข้อมูลอาร์เรย์เซ็นเซอร์) พร้อมรายการข้อมูลทั้งหมดที่เราต้องการแสดงอยู่ในบล็อกคุณสมบัติ

การสร้างวัตถุและการเข้าถึงคุณสมบัติ

ในการสร้างวัตถุหรืออินสแตนซ์ของคลาสที่เรากำหนดไว้ เราใช้คำสั่ง

>> s = เศร้า;

ในการตั้งค่าของคุณสมบัติ เราระบุชื่อเหมือนกับฟิลด์ของโครงสร้างด้วย

>> s.NumSensors = 16;

เราสามารถแสดงอ็อบเจกต์โดยดูคุณสมบัติที่มีอยู่ทั้งหมดและค่าปัจจุบันโดยพิมพ์ชื่ออ็อบเจกต์

>> ss = sads ที่มีคุณสมบัติ: ความยาวคลื่น: [] c: 300000000 NumSensors: 16 NumSamples: [] Data: [] Spacing: [] SampleRate: [] Name: []

คุณสมบัติทั้งหมดยกเว้นNumSensorsและยังคงว่างเปล่า ขณะนี้ชุดข้อมูลสามารถระบุเป็นเศร้าวัตถุโดยใช้ระดับการทำงาน,คือฟังก์ชัน และใครคำสั่ง สิ่งที่เป็นไปไม่ได้กับโครงสร้าง

>> class(s)ans = 'เศร้า'

ความสามารถในการระบุคลาสของตัวแปรมีความสำคัญต่อผู้ใช้ที่สร้างรหัสเพื่อดำเนินการกับชุดข้อมูล เนื่องจากจะช่วยให้พวกเขากำหนดรายการข้อมูลที่มีอยู่ที่จะเข้าถึงและการดำเนินการที่สามารถดำเนินการได้ตามกฎหมาย

การตรวจสอบข้อผิดพลาด

หากคุณใช้โครงสร้างเพื่อแสดงข้อมูลของคุณ คุณสามารถเพิ่มชื่อฟิลด์ใหม่ได้ทุกเมื่อ เพียงแค่ระบุชื่อฟิลด์ใหม่และกำหนดค่าให้กับฟิลด์นั้น ความสามารถนี้สะดวกอย่างยิ่งเมื่อคุณทำการทดลองและสร้างอัลกอริทึมต้นแบบ อย่างไรก็ตาม หากคุณสะกดชื่อฟิลด์ผิด ฟิลด์ใหม่จะถูกเพิ่มโดยไม่แจ้งให้ทราบ ซึ่งอาจทำให้เกิดข้อผิดพลาดในภายหลังซึ่งยากต่อการวินิจฉัย

ไม่เหมือนกับโครงสร้าง คุณไม่สามารถเพิ่มคุณสมบัติใหม่ให้กับออบเจกต์ได้โดยการระบุชื่อคุณสมบัติใหม่และกำหนดค่าให้กับออบเจกต์ หากคุณสะกดชื่อคุณสมบัติของวัตถุผิด MATLAB จะแสดงข้อผิดพลาดทันที การตรวจสอบข้อผิดพลาดในระดับเพิ่มเติมนี้มีประโยชน์เมื่อวัตถุถูกเข้าถึงโดยผู้ใช้ที่ไม่คุ้นเคยมากกว่าผู้เขียน ซึ่งเป็นเรื่องปกติในระหว่างการพัฒนาแอปพลิเคชันขนาดใหญ่

การควบคุมการเข้าถึงข้อมูล

ชั้นเรียนช่วยให้คุณควบคุมการเข้าถึงทรัพย์สินได้อย่างยอดเยี่ยม ตัวอย่างเช่น อนุญาตให้คุณห้ามการแก้ไขคุณสมบัติ ซ่อนคุณสมบัติ หรือทำให้คำนวณแบบไดนามิก คุณควบคุมการเข้าถึงคุณสมบัติโดยการระบุคุณสมบัติคุณสมบัติในไฟล์นิยามคลาส เราขยายไฟล์นิยามคลาสในรูปที่ 2 โดยแบ่งรายการคุณสมบัติปัจจุบันออกเป็นหลายบล็อกคุณสมบัติ โดยแต่ละรายการมีแอตทริบิวต์คุณสมบัติเฉพาะ:ได้รับการเข้าถึง,คงที่, และขึ้นอยู่กับ(รูปที่ 3)

รูปที่ 3 ไฟล์นิยามคลาสเศร้า.mด้วยคุณสมบัติของคุณสมบัติ

(Video) แนะนำการใช้โปรแกรม MATLAB เบื้องต้น

คุณห้ามการปรับเปลี่ยนคุณสมบัติโดยการตั้งค่าคงที่คุณลักษณะ. ในตัวอย่างของเรา เราจะตั้งค่าคุณสมบัติความเร็วของแสงให้คงที่ เนื่องจากคุณสมบัติคงที่ไม่เปลี่ยนแปลง จึงสามารถเข้าถึงได้ง่ายๆ โดยอ้างอิงชื่อคลาส

>> sads.cans = 300000000

คุณทำให้คุณสมบัติเป็นแบบอ่านอย่างเดียวโดยการตั้งค่าตั้งค่าการเข้าถึงแอตทริบิวต์เป็นส่วนตัว คุณสามารถทำให้พร็อพเพอร์ตี้มองเห็นได้เฉพาะกับเมธอดที่ดำเนินการเท่านั้นโดยการตั้งค่าได้รับการเข้าถึงแอตทริบิวต์เป็นส่วนตัวตามที่เราจะทำกับความยาวคลื่นคุณสมบัติ.

คุณสามารถเปลี่ยนชื่อหรือคุณลักษณะของคุณสมบัติส่วนตัวได้อย่างอิสระโดยไม่กระทบต่อผู้ใช้ของวัตถุ แนวทาง "กล่องดำ" นี้เพื่อกำหนดชิ้นส่วนของซอฟต์แวร์ ซึ่งเรียกว่าการห่อหุ้ม ป้องกันไม่ให้ผู้ใช้อ็อบเจกต์ต้องพึ่งพารายละเอียดการใช้งานหรือลักษณะเฉพาะที่อาจเปลี่ยนแปลงและทำลายโค้ดได้

คุณระบุว่าคุณสมบัติจะถูกคำนวณเฉพาะเมื่อถูกร้องขอโดยการตั้งค่าเท่านั้นขึ้นอยู่กับคุณลักษณะ.

จากนั้น คุณระบุเมธอด get ที่จะเรียกโดยอัตโนมัติเมื่อเข้าถึงพร็อพเพอร์ตี้ ดู"การเข้าถึงคุณสมบัติด้วยวิธี Get and Set"ของบทความนี้เพื่อดูรายละเอียดเกี่ยวกับการระบุเมธอดคลาส ในแอปพลิเคชันของเรา เราตั้งค่าNumSensorsและจำนวนตัวอย่างคุณสมบัติที่ต้องพึ่งพิง

การนำการดำเนินการไปใช้ด้วยวิธีการแบบคลาส

เมธอดหรือการดำเนินการที่สามารถดำเนินการกับออบเจกต์ได้ระบุไว้เป็นรายการของฟังก์ชันในบล็อกเมธอด คลาสสามารถมีเมธอดได้หลายประเภท แต่ละเมธอดมีจุดประสงค์ต่างกัน แต่ละเมธอดระบุต่างกัน ส่วนต่อไปนี้จะอธิบายถึงประเภทของวิธีการเหล่านี้

เราจะเพิ่มบล็อกเมธอดให้กับเศร้าและเพิ่มเมธอดใหม่แต่ละเมธอดภายในบล็อกนี้ (รูปที่ 4)

รูปที่ 4 ไฟล์นิยามคลาสเศร้า.mด้วยวิธีการแสดงในโปรแกรมแก้ไข MATLAB เพื่อความสะดวกในการดู คุณลักษณะการพับโค้ดจะใช้เพื่อซ่อนโค้ดส่วนใหญ่

การระบุวิธีการสร้าง

ในตัวอย่างของเรา เราจะระบุเมธอดคอนสตรัคเตอร์ที่ให้ผู้ใช้ระบุพารามิเตอร์ที่จะใช้ในการสร้างอ็อบเจกต์ เมธอดตัวสร้างมักจะดำเนินการเริ่มต้นและตรวจสอบข้อมูล ขณะนี้วัตถุถูกสร้างขึ้นด้วย

>> s = sads (ข้อมูล, ความยาวคลื่น, อัตราตัวอย่าง, ระยะห่าง, ชื่อ);

การใช้วิธีการเฉพาะของแอปพลิเคชัน

เราจะเพิ่มวิธีการหลายวิธีในการดำเนินการเฉพาะแอปพลิเคชันเพื่อดำเนินการกับชุดข้อมูล วิธีการส่วนใหญ่ใช้วัตถุเป็นอาร์กิวเมนต์อินพุต (ตัวอย่างเช่นออบ) และเข้าถึงคุณสมบัติของวัตถุโดยอ้างอิงตัวแปรนี้ (ตัวอย่างเช่นobj.NumSamples) เช่นเดียวกับวิธีนี้:

ฟังก์ชัน mag = magfft(obj, zpt)mag = ศูนย์(obj.NumSamples, zpt); ...จบ

แม้ว่าจะต้องใช้ไวยากรณ์เพิ่มเติม แต่การอ้างอิงคุณสมบัติผ่านตัวแปรออบเจกต์สามารถช่วยแยกความแตกต่างจากตัวแปรฟังก์ชันโลคัล เช่นแม็กข้างบน.

วิธีการโทร

เมธอดถูกเรียกเหมือนกับฟังก์ชัน โดยที่ออบเจกต์ถูกส่งผ่านเป็นหนึ่งในอาร์กิวเมนต์ เราสามารถประมาณมุม DOA ของแหล่งที่มาได้โดยการเรียกโดอาวิธีการของชั้นเรียนของเรา

>> มุม = doa(s) มุม = -10.1642 18.9953

มุม DOA จะประมาณตำแหน่งที่แท้จริงของแหล่งที่มาที่แสดงในรูปที่ 1 ซึ่งอยู่ที่ -10° และ 20°

การเข้าถึงคุณสมบัติด้วยวิธีรับและตั้งค่า

คุณสามารถตรวจสอบคุณสมบัติหรือใช้คุณสมบัติที่ขึ้นต่อกันได้โดยการระบุเมธอด set และ get ที่เกี่ยวข้อง นี่คือวิธีการรับสำหรับNumSensorsคุณสมบัติ.

การทำงานNumSensors = get.NumSensors(obj)NumSensors = ขนาด(obj.Data, 2);จบ

เมธอด Get และ set จะถูกเรียกใช้โดยอัตโนมัติเมื่อมีการเข้าถึงคุณสมบัติ เช่น ด้วย

>> N = s.NumSensors;

การระบุเมธอดสำหรับฟังก์ชัน MATLAB ที่มีอยู่ด้วยการโอเวอร์โหลด

การโอเวอร์โหลดทำให้คุณสามารถกำหนดฟังก์ชัน MATLAB ที่มีอยู่ใหม่ให้ทำงานบนออบเจกต์ของคุณได้โดยระบุฟังก์ชันที่มีชื่อนั้นในรายการเมธอดของคุณ ในแอปพลิเคชันของเรา เราจะรวมโอเวอร์โหลดพล็อตmethod จัดให้มีฟังก์ชันแสดงภาพชุดข้อมูลที่ผู้ใช้ MATLAB หลายคนคุ้นเคย (รูปที่ 5)

>> โครงเรื่อง
(Video) Introduction to Object-Oriented Programming and Classes in MATLAB

รูปที่ 5 วิธีการพล็อตโอเวอร์โหลดเฉพาะสำหรับชุดข้อมูลอาร์เรย์เซนเซอร์

วิธีการลงจุดแบบกำหนดเองนี้แสดงข้อมูลด้วยวิธีที่เหมาะสมที่สุดสำหรับชุดข้อมูลนี้ โดยใส่คำอธิบายประกอบด้วยข้อมูลที่มีอยู่ทั้งหมด มันถูกดำเนินการบนวัตถุที่ได้รับการกำหนดไว้เท่านั้น ซึ่งเป็นวิธีการที่มีประสิทธิภาพมากกว่าการจัดการกับลำดับของไดเร็กทอรีในเส้นทาง

หากคุณต้องการพฤติกรรมเฉพาะสำหรับชั้นเรียนของคุณ คุณยังสามารถโอเวอร์โหลดตัวดำเนินการพื้นฐานและแม้กระทั่งการจัดทำดัชนีโดยใช้เมธอดที่มีชื่อพิเศษ

การพัฒนาแอปพลิเคชันต่อไป

คลาสที่เราสร้างขึ้นในตัวอย่างนี้แสดงถึงชุดข้อมูลอาร์เรย์เซนเซอร์ของเรา และช่วยให้เราดำเนินการวิเคราะห์เฉพาะทางที่ซับซ้อนบนข้อมูลของเราได้อย่างง่ายดาย รวมถึงการดำเนินการค้นหาทิศทางหลัก เราสามารถใช้คลาสนี้เพื่อประเมินประสิทธิภาพของเทคนิคที่ใช้ FFT อย่างรวดเร็วในสถานการณ์ต่างๆ

เราสามารถขยายแอปพลิเคชันโดยใช้เทคนิค OO เพิ่มเติม ตัวอย่างเช่น เราสามารถทำสิ่งต่อไปนี้:

  • กำหนดคลาสย่อยของคลาสที่มีอยู่ (ใช้คำจำกัดความของหมวดหมู่ที่กว้างขึ้นเพื่อกำหนดหมวดหมู่ย่อยที่เฉพาะเจาะจงมากขึ้น) ด้วยการสืบทอด
  • ระบุเมธอดแบบสแตติก ให้เรากำหนดการดำเนินการสำหรับคลาสโดยรวม
  • ใช้คลาสแฮนเดิลที่มีพฤติกรรมอ้างอิง ทำให้เราสามารถสร้างโครงสร้างข้อมูล เช่น รายการที่เชื่อมโยง หรือทำงานกับชุดข้อมูลขนาดใหญ่โดยไม่ต้องคัดลอก
  • กำหนดเหตุการณ์และผู้ฟัง ให้เราตรวจสอบคุณสมบัติหรือการกระทำของวัตถุ

เทคนิคเหล่านี้ช่วยเพิ่มความสามารถของเราในการจัดการความซับซ้อนโดยช่วยให้เราสามารถกำหนดความสัมพันธ์และลักษณะการทำงานในแอปพลิเคชันเพิ่มเติมได้

(Video) Object oriented programming in matlab

เนื่องจากสร้างขึ้นโดยใช้เทคนิค OO แอปพลิเคชันจึงมีความแข็งแกร่งเพียงพอให้ผู้อื่นใช้และบำรุงรักษา และสามารถรวมเข้ากับแอปพลิเคชันอื่นทั่วทั้งองค์กรได้

เผยแพร่ 2020

ผลิตภัณฑ์ที่ใช้

  • แมทแล็บ
  • กล่องเครื่องมือสถิติและการเรียนรู้ของเครื่อง

เรียนรู้เพิ่มเติม

  • ทรัพยากรการเขียนโปรแกรมเชิงวัตถุ
  • เรียนรู้ MATLAB ฟรี
  • เรียนรู้การเขียนโค้ดด้วย MATLAB

ดูบทความสำหรับความสามารถที่เกี่ยวข้อง

  • คอมพิวเตอร์ทางเทคนิค

ดูบทความสำหรับอุตสาหกรรมที่เกี่ยวข้อง

  • โครงสร้างพื้นฐานการสื่อสาร
(Video) Object oriented Programming with MATLAB Classes and Objects

Videos

1. Truss Analysis by Object-Oriented Programming (OOP) in MATLAB
(Engineer Hunter)
2. matlab object oriented programming in data analysis
(CodeTheMath)
3. ทบทวน OOP ฉบับเร่งรีบ - Generic Methods
(DE DPU)
4. การเขียนโปรแกรมเชิงวัตถุ 1
(Jittat Fakcharoenphol)
5. EGME206 (Wk 1, Part 2/2) MATLAB Tutorial
(Ittichote Chuckpaiwong)
6. FreeMat Tutorial Part 1
(Aj. Rawin)
Top Articles
Latest Posts
Article information

Author: Jonah Leffler

Last Updated: 24/05/2023

Views: 5275

Rating: 4.4 / 5 (65 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Jonah Leffler

Birthday: 1997-10-27

Address: 8987 Kieth Ports, Luettgenland, CT 54657-9808

Phone: +2611128251586

Job: Mining Supervisor

Hobby: Worldbuilding, Electronics, Amateur radio, Skiing, Cycling, Jogging, Taxidermy

Introduction: My name is Jonah Leffler, I am a determined, faithful, outstanding, inexpensive, cheerful, determined, smiling person who loves writing and wants to share my knowledge and understanding with you.