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 پیاده سازی کنند:
- پردازش داده های اعلامیه: به وضوح فرایند تبدیل داده ها را از طریق زنجیره بسته شدن بیان کنید.
- چند برابر منطقی و جدا کردن: بسته شدن قوانین مستقل تجارت ، حمایت از جایگزینی پویا.
- تعادل عملکرد و خوانایی: از توابع مرتبه بالا و ترکیبات بسته شده برای جلوگیری از کد اضافی استفاده کنید.
در توسعه واقعی ، ما توصیه می کنیم از اصل “مسئولیت واحد برای بسته شدن” پیروی کنید. هر بسته شدن در تکمیل یک مرحله پردازش داده ، تشکیل یک خط لوله پردازش کامل از طریق ترکیبی از اپراتورهای جریان یا توابع برای اطمینان از مختصر و کارآمد بودن کد متمرکز است.