با درود خدمت شما دوستان گرامی و اساتید محترم . یک فانکشن تست می زارم خدمتتون در فانکشن زیر فقط create_post_category_cms_sender تغییر می کنه و بقیه هیچ تغییری نخواهند کرد . چیجوری می شه یک فانکشن با اینچنین ورودی رو در پارامتر های فانکشن test گرفت . اگر چنین چیزی درست بشه می تونم تقریبا ۸۰ درصد یکی از فایل هامو بهبود بدم
def test() do
with {:ok, %{acl: "admin", info: _info}} <- TrangellApiGateway.User.Login.user_acl_check(allreq),
{:ok, ms} <- http_error_handeller(conn, Post.create_post_category_cms_sender(allreq), "created") do
conn
|> put_status(201)
|> json(%{message: ms})
else
_ ->
conn
|> put_status(400)
|> json(%{error: "Your request is invalid."})
end
end
سام عزیز . این پترن مچ می کنه فکر کنم . ولی من به دنبال اینم که در قطعه کد بالا که نوشتم Post.create_post_category_cms_sender(allreq) حالا بودون تغییر بقیه کد بیام مثلا بزنم Post.name(allreq) آیا fallback این کارو می کنه ؟
درود سام عزیز خیلی ممنون خیلی کاربردی بود . من پستی که شما لطف کردید قرار دادید را خوندم زیاد متوجه نشدم ولی رفتم داکیومنت خوندم متوجه شدم می تونم خیلی از بخش های ارور هامو که تو هر فانکشن تکرار کردم رو می تونم با این کار حذف کنم . فقط نیاز هست یک کنترلر درست کنم و چندین حالت براش تعریف کنم
کاشکی زودتر یادم می اومد شما زحمت کشیده بودید قبلا معرفی کرده بوددیدش ولی من متاسفانه سام عزیز نتونستم کاری که می خواستم در پست اول یعنی جایگزینی فانکشن رو عملی کنم شاید سوالمو بد پرسیدم .
شما فرض کنید این چنین فانکشن هایی داریم
def create_post_category_cms_sender(params) do
post_sender_json_without_authorization(params, "post/create-category")
end
def edit_post_category_cms_sender(params) do
put_sender_json_without_authorization(params, "post/edit-category")
end
def delete_post_category_cms_sender(params) do
delete_sender_json_without_authorization(params, "post/delete-category")
end
def info_category_all_post_cms_sender(params) do
post_sender_json_without_authorization(params, "post/all-category")
end
def get_posts_category_cms_sender(params) do
post_sender_json_without_authorization(params, "post/category")
end
def create_cms_post_cms_sender(params) do
post_sender_json_without_authorization(params, "post/create-post")
end
هر کدوم از این ها اطلاعات رو به روتری خاص می فرستند . چرا تکرار شده باید بگم ممکنه بعدا توی هر کدوم اطلاعات بیشتری بخوام به همین منظور کمی تکراری شده ولی مشکل اینجا نیست
حالا کدی که این هارو فراخوانی می کنه کد زیر هست که در پست اول قرار دادم .
with {:ok, %{acl: "admin", info: _info}} <- TrangellApiGateway.User.Login.user_acl_check(allreq),
{:ok, ms} <- http_error_handeller(conn, Post.create_cms_post_cms_sender(allreq), "created") do
conn
|> put_status(200)
|> json(%{message: ms})
else
_ ->
conn
|> put_status(400)
|> json(%{error: "Your request is invalid."})
end
حالا در این هر سری باید یک فانکشن بزارم . لازم به ذکر هست ارور همشون یک جور هست با این fallback می شه همشون حذف کرد خیلی خوبه
ولی متاسفانه
هر سری داره تکرار می شه. می خوام این گزینه حذف بشه و هر سری من تکرارش نکنم . البته اینجا اصلا لزومی نداره چون خودش خلاصه شده کد هست و با فال بک ارور ها پاک می شه و خودش به اندازه کافی بهینه سازی شده ولی بعدا شاید کدی بهم بربخوره که نیاز دارم فانکشن وسط کد هی تغییر کنه چطور باید عمل بشه
یکی بهم این راه رو پیشنهاد داد
def test_1(), do: test(:name)
def test_2(), do: test(:other_name)
defp test(function_name) do
with {:ok, %{acl: "admin", info: _info}} <- TrangellApiGateway.User.Login.user_acl_check(allreq),
{:ok, ms} <- http_error_handeller(conn, apply(Post, function_name, [allreq]), "created") do
conn
|> put_status(201)
|> json(%{message: ms})
else
_ ->
conn
|> put_status(400)
|> json(%{error: "Your request is invalid."})
end
end
به روز رسانی
پستی که زدم تکمیل تر شد به همین منظور در اینجا هم لینکشو قرار می دم هم پیشنهاد یکی دیگر از کاربران انجمن الکسیر . اگر دوستان فکر می کنند در این راه ها مشکلی هست لطفا تذکر دهند
منبع :
I think it is better to pass a lambda as an argument to test function.
In this case, compiler can catch errors if function or module doesn’t exist.