برنامه نویسی

Harmonyos برنامه نویسی عملکردی بعدی و کاربرد عملی بسته شدن در عملیات مجموعه

این مقاله به شیوه های خاص برنامه نویسی کاربردی و بسته شدن در عملیات جمع آوری در هارمونیوس بعدی می پردازد ، و نحوه استفاده از تعطیلی برای دستیابی به منطق پردازش داده های کارآمد از طریق نمونه های کد را تجزیه و تحلیل می کند تا از ویژگی های غیرقانونی جلوگیری شود.

1. فیلتر و تبدیل مجموعه: شرایط پویا تعطیلی

هنگام پردازش داده های جمع آوری مانند آرایه ها و لیست ها ، بسته شدن ها می توانند به صورت پویا شرایط فیلتر یا قوانین تبدیل را ضبط کنند ، منطق کسب و کار را از عملیات داده جدا کرده و قابلیت استفاده مجدد از کد را بهبود بخشند.

1.1 عناصر جمع آوری دینامیکی فیلتر

منطق فیلتر کردن را از طریق عملکرد کارخانه بسته شدن محاصره کنید createFilter، اجازه می دهد تا شرایط مختلف فیلتر در زمان اجرا منتقل شود.

// Closure factory: Generate generic filtering functions
func createFilter<T>(predicate: (T) -> Bool): (Array<T>) -> Array<T> {  
  return { array in array.filter(predicate) }  
}  

// Business scenario: Filter long text in string array (length>5)
let texts = ["apple", "banana", "cherry", "date"]  
let longTextFilter = createFilter { $0.length > 5 }  
let result = longTextFilter(texts) // Output: ["banana", "cherry"]
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نکات کلیدی:

  • در predicate پارامتر بسته شدن مسئول منطق فیلتر خاص است و بسته شدن آن توسط createFilter مسئول انجام فیلتر است.
  • از شرایط سوئیچینگ پویا (مانند تعویض از فیلتر طول به فیلتر کلمه کلیدی) پشتیبانی کنید ، بدون اینکه منطق اجرای فیلتر را اصلاح کنید.

1.2 تبدیل و نقشه برداری نوع

برای اجرای نوع تبدیل عناصر جمع آوری و ساخت خطوط لوله پردازش در ترکیب با اپراتور جریان ، از بسته شدن استفاده کنید |>بشر

// String to integer array (ignoring invalid values)
let stringNumbers = ["1", "2", "three", "4"]  
let toInt = { (s: String) -> Int64? in Int64(s) } // Closure handling type conversion
let numbers = stringNumbers  
|> map(toInt) // Map as optional integer
|> filter { $0 != nil } // Filter empty values
|> map { $0! } // Unpacking optional value

// Output: [1, 2, 4]
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

** مزایای **:

  • هر مرحله از تحول با بسته شدن مستقل ، که از نظر منطقی واضح و قابل استفاده مجدد است ، تکمیل می شود.
  • |> اپراتور جریان داده ها را بصری ، آسان برای اشکال زدایی و گسترش می کند.

2. مرتب سازی و فداکاری مجموعه: هماهنگی بین توابع خالص و تعطیلی

توابع خالص از تعیین کننده قوانین مرتب سازی اطمینان می یابد ، در حالی که بسته شدن ها وظیفه ضبط پارامترهای مرتب سازی پویا را دارند و این دو را برای دستیابی به مرتب سازی مجموعه ای انعطاف پذیر ترکیب می کنند.

2.1 قوانین مرتب سازی سفارشی

عبور از منطق مرتب سازی از طریق بسته شدن ، از تنظیم زمان در حال اجرا استراتژی های مرتب سازی (مانند صعود ، نزولی و مرتب سازی در زمینه سفارشی) پشتیبانی می کند.

// Pure functions: general sorter (accepts comparison closures)
func sort<T>(array: Array<T>, comparator: (T, T) -> Bool): Array<T> {  
  return array.sorted(by: comparator)  
}  

// Business scenario: Sort by descending order of string length
let fruits = ["apple", "grape", "banana", "pear"]  
let sortByLength = sort(comparator: { $0.length > $1.length })  
let sortedFruits = sortByLength(fruits) // Output: ["banana", "grape", "apple", "pear"]
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نقاط طراحی:

  • در comparator بسته شدن منطق مقایسه خاص ، و sort عملکرد بر روی مرتب سازی اجرا متمرکز است.
  • از مرتب سازی پیچیده (مانند شرایط چند سطح) پشتیبانی می کند ، فقط قوانین مقایسه را در بسته شدن اصلاح کنید.

2.2 بسته شدن بسته شدن منطق deduplication

برای تحقق بخشیدن به عملکرد فداکاری عمومی ، از بسته شدن قوانین قضاوت منحصر به فرد از عناصر مجموعه استفاده کنید.

// Pure functions: deduplication based on custom equality judgment
func distinct<T>(array: Array<T>, isEqual: (T, T) -> Bool): Array<T> {  
  var uniqueItems = [T]()  
  for item in array {  
    if !uniqueItems.contains(where: { isEqual($0, item) }) {  
      uniqueItems.append(item)  
    }  
  }  
  return uniqueItems  
}  

// Scene: Deduplicate custom objects (judging equality by ID)
struct User {  
  var id: Int64  
  var name: String  
}  

let users = [User(id: 1, name: "Alice"), User(id: 2, name: "Bob"), User(id: 1, name: "Alice")]  
let distinctUsers = distinct(users, isEqual: { $0.id == $1.id }) // Output: [User(id:1), User(id:2)]
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

منطق اصلی:

  • در isEqual بسته شدن قوانین برابری شی را تعریف می کند ، منطق فداکاری و انواع خاص را جدا می کند.
  • مناسب برای انواع پیچیده ای که نمی توان مستقیماً با آن استفاده کرد Equatable پروتکل

3. کاهش و تجمع: تجمع حالت بسته شدن

کاهش عملیات عناصر جمع آوری را از طریق بسته شدن ، که مسئول منطق به روزرسانی حالت در این فرآیند هستند ، به یک نتیجه واحد جمع می کنند.

3.1 محاسبه تجمع عددی

از بسته شدن برای تعریف منطق انباشت برای اجرای خلاصه ، محصول و سایر عملیات استفاده کنید.

// Calculate the sum of squared elements of the array
let numbers = [1, 2, 3, 4]  
let sumOfSquares = numbers.reduce(0) { acc, num in  
acc + num * num // Closed square value
} // Output: 30 (1+4+9+16)
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

سادگی منعکس می شود:

  • پارامتر بسته شدن acc حالت تجمعی است ، و num عنصر فعلی است و منطق ساده است.
  • می توان به راحتی به سایر منطق تجمع (مانند یافتن حداکثر ، متوسط) گسترش یافت.

3.2 تجمع شی پیچیده

گروه بندی ، آمار و سایر عملیات در مورد مجموعه اشیاء سفارشی ، و بسته شدن آن وظیفه استخراج مقادیر ویژگی را دارد.

// Statistics the total amount of the order (the order list contains discount information)
struct Order {  
  var quantity: Int64  
  var price: Float64  
  var discount: Float64  
}  

let orders = [Order(quantity: 2, price: 10.0, discount: 0.1), Order(quantity: 1, price: 15.0, discount: 0.2)]  
let totalAmount = orders.reduce(0.0) { acc, order in  
  let itemPrice = order.price * (1 - order.discount) * Float64(order.quantity)  
return acc + itemPrice // closure calculates the amount of a single order and accumulates it
} // Output: (2*10*0.9)+(1*15*0.8)=18+12=30.0
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

تجزیه و تحلیل مزیت:

  • بسته شدن می تواند شامل منطق پیچیده تجارت (مانند محاسبات تخفیف) برای حفظ جهانی بودن عملیات کاهش باشد.
  • از مسیر صریح حلقه خودداری کنید ، کد بیشتر مطابق با الگوی برنامه نویسی عملکردی است.

4. بهینه سازی عملکرد و اقدامات احتیاطی

4.1 از عملیات غیر ضروری در بسته شدن خودداری کنید

محاسبات ثابت را از بسته شدن حذف کنید تا پردازش تکراری در حلقه کاهش یابد.

// Counterexample: Repeated calculation of threshold values ​​within closure
let threshold = 100  
let data = [1, 2, 3, ..., 1000]  
let filtered = data.filter { $0 * 2 > threshold } // Each time the closure is called, the threshold value is calculated

// Optimization: Calculate the threshold multiple in advance
let doubleThreshold = threshold * 2  
let filtered = data.filter { $0 > doubleThreshold } // Only comparison operations are performed in the closure
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

4.2 استفاده ترجیحی از توابع مرتبه بالاتر داخلی

انواع مجموعه زبان Cangjie (مانند Array) دارای توابع مرتبه بالاتر مانند filterبا mapبا reduce، و غیره ، و عملکرد آنها بهینه شده است و باید ابتدا به جای اجرای دستی استفاده شود.

// Recommended: Use built-in filter instead of custom loops
let evenNumbers = numbers.filter { $0 % 2 == 0 }  

// Not recommended: Manually implement filtering logic
let evenNumbers = [Int64]()  
for num in numbers { if num % 2 == 0 { evenNumbers.append(num) } }  
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

5. خلاصه: مقدار اصلی بسته شدن عملکردی در عملیات مجموعه

از طریق ادغام برنامه نویسی و تعطیلی عملکردی ، توسعه دهندگان می توانند آن را در برنامه های Hongmeng پیاده سازی کنند:

  • پردازش داده های اعلامیه: به وضوح فرایند تبدیل داده ها را از طریق زنجیره بسته شدن بیان کنید.
  • چند برابر منطقی و جدا کردن: بسته شدن قوانین مستقل تجارت ، حمایت از جایگزینی پویا.
  • تعادل عملکرد و خوانایی: از توابع مرتبه بالا و ترکیبات بسته شده برای جلوگیری از کد اضافی استفاده کنید.

در توسعه واقعی ، ما توصیه می کنیم از اصل “مسئولیت واحد برای بسته شدن” پیروی کنید. هر بسته شدن در تکمیل یک مرحله پردازش داده ، تشکیل یک خط لوله پردازش کامل از طریق ترکیبی از اپراتورهای جریان یا توابع برای اطمینان از مختصر و کارآمد بودن کد متمرکز است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا