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



