কোনও জটিল ইএল এক্সপ্রেশনটি কি কোনও একক জাভাবিন প্রাপ্তির দ্বারা প্রতিস্থাপন করা উচিত?


10

জেএসএফ-এ যদি আমার এমন একটি উপাদান থাকে যা শর্তাধীনভাবে বিভিন্ন ভেরিয়েবলের উপর ভিত্তি করে রেন্ডার দেয় যে রেন্ডার স্টেটমেন্টটি হ্যান্ডেল করার সর্বোত্তম উপায় কী ... যুক্তিটি কি উপাদান ঘোষণায় বা কোনও সহায়ক সহায়ক শ্রেণিতে বাস করা উচিত?

উওফটি পাঠ্যটি কেবল তখনই প্রদর্শিত হয় যখন কোনও প্রাণী একটি হাতি বা কুকুর হয় এবং প্রাণী নিঃশব্দ হয় না।

বিকল্প 1:

দৃশ্যে বাস্তবায়ন:

<h:outputText id="text" value="woof" 
  rendered="#{animal.type == 'elephant' 
                  or animal.type == 'dog' and not(animal.mute)}"/>

বা বিকল্প 2:

encapsulation:

<h:outputText id="text" value="woof" rendered="#{animal.barkingAnimal}"/>

বাস্তবায়নের সাথে:

public class Animal {
     public boolean isBarkingAnimal() {
         return ("dog".equals(getType()) || "elephant".equals(getType())) && !isMute();
     }
...

কাজেই দু'জনেই কাজ করছেন ... তবে দৃশ্যটি পরিচালনা করার সঠিক উপায় কোনটি?


সেই বিশেষ উদাহরণের জন্য আমি এল ব্যবহার করব। এটি কেবলমাত্র সম্পর্কিত ডেটা দেখে মনে হচ্ছে। যদি আপনার জাভা কোডটিতে আপনার কিছু যুক্তি থাকে barking animalsতবে আমি সেই পদ্ধতিটিকে কল করব কারণ এটি ইতিমধ্যে বিদ্যমান। আপনি যদি একাধিক সাইটে এটির দর্শনের যুক্তি ব্যবহার করেন তবে আপনি এটি থেকে একটি এল ফাংশন তৈরি করতে পারেন।

এক্সপ্রেশন ভাষা মূলত বলা হয় সহজ সম্ভাব্য এক্সপ্রেশন ভাষা যাতে তার উদ্দীষ্ট ব্যবহার এ প্রজ্ঞান পারে। আমার নিজস্ব দৃষ্টিভঙ্গি: যদি এটি যুক্তিযুক্ত দৃষ্টিভঙ্গি হয় তবে EL উপযুক্ত হতে পারে; যদি এটি ব্যবসায় যুক্তিযুক্ত হয়, তবে তা নয়।
ম্যাকডোয়েল

উত্তর:


5

বেশিরভাগ ক্ষেত্রে, এটি কেবল স্বাদের বিষয়। যদি আপনার উদ্বেগ শর্তটি সহজভাবে ব্যবহার করে তবে আপনিও তা করতে পারেন:

<ui:param name="animalCanBark" value="#{animal.type == 'elephant' 
              or animal.type == 'dog' and not(animal.mute)}" />
...
<h:outputText id="text" value="woof" rendered="#{animalCanBark}"/>

আপনার প্রায়শই যে অভিব্যক্তিটি লেখার প্রয়োজন হয় তার মধ্যে কেবলমাত্র একটি অবজেক্টের চেয়ে বেশি জড়িত থাকে তা এগুলি প্রায়শই কার্যকর হয়:

<ui:param name="showBarking" value="#{animal.type == 'elephant'
              and not facesContext.validationFailed" />

আমি মনে করি অনেক লোক EL এর পরিবর্তে জাভাতে এই জাতীয় যুক্তি লিখতে পছন্দ করেন কারণ জাভা সংকলক জাভা কোডে টাইপ চেকিং করতে পারে (এছাড়াও, বেশিরভাগ IDEs জাভাতে .XHTML ফাইলের জন্য আরও ভাল স্বয়ংক্রিয়ায়ণ করতে পারেন), যা উদ্বেগের বিষয় কিছুর জন্য.

এই কথাটি বলার পরে, এটি যদি কোনও মডেল সম্পর্কিত কোনও তথ্য যে কোনও দিন অন্য কোনও জায়গায় ব্যবহার করা যেতে পারে (কেবলমাত্র অন্য ফেসলেটস / জেএসএফ পৃষ্ঠা নয়), এটি আপনার জাভা কোডে করার জন্য একটি ভাল কারণ তৈরি করবে। আপনি যে উদাহরণটি দিয়েছেন, সেই পদ্ধতিটি isBarkingAnimal()মডেল ( Animal) সম্পর্কে কিছু তথ্য দেয় , যা কোনও দিন দরকারী হয়ে উঠতে পারে যখন অন্য কোনও বস্তু (কেবলমাত্র অন্য ফেসলেট পৃষ্ঠা নয়) কোনও প্রদত্ত প্রাণীর ছাঁটা হয় কিনা তা জানতে হবে। সুতরাং, আমি সম্ভবত যে যেতে হবে।


3

থাম্বের নিয়ম হিসাবে .xhtml ফাইলগুলিকে যথাসম্ভব যুক্তি-মুক্ত রাখার চেষ্টা করুন, সুতরাং তারা কেবল উপস্থাপনা নিয়ে কাজ করে। সুতরাং, স্পষ্টভাবে বিকল্প 2 জন্য যান।


2
মডেলটির যত্ন নেওয়া উচিত এমন যুক্তি কি? যদি এটি একাধিকবার ব্যবহৃত হয় তবে কেন এটি ব্যবহার করে এলিয়াসিং করা হবে <c:set>বা <ui:param>বিকল্প হবে না?

সেই উদাহরণটির পিছনে কোনও মডেল যুক্তি নেই। আপনি ভিউ লজিকে মডেল লজিকের দিকে স্থানান্তরিত করবেন, যা জাভা কোড উত্পন্ন করে যা জাভাতেও ডাকা হয় না। ক্লাসটি Animalযদি অন্য পরিবেশে থাকে (দূরবর্তী) বা প্রোগ্রামাররা এর জন্য এটি কেবল অপ্রাসঙ্গিক দেয়।

1

ব্যক্তিগতভাবে, আমি বিকল্প # 2 ব্যবহার করব। যদিও আমি জানি যে ইএল ব্যবহার করে সমস্যাটি সমাধান করা এবং ফাংশন বা ইউআই ব্যবহার করে এক্সএইচটিএমএল ডকুমেন্টগুলি জুড়ে কিছুটা পুনরায় ব্যবহার করা সম্ভব: প্যারামগুলির মধ্যে এটি জাভা শিম প্রয়োগের বহনযোগ্যতা, রক্ষণাবেক্ষণযোগ্যতা এবং পরীক্ষার দক্ষতার অভাব বলে মনে হয়।

যদি কোনও বিকাশকারী ইএল এবং জাভা উভয় ক্ষেত্রেই সাবলীল হন এবং এক্সএইচটিএমএল এবং জাভা উভয় মটরশুটির মালিক হন তবে আকার> 1 এর সাথে কোনও শর্তসাপেক্ষ মূল্যায়ন করতে EL ব্যবহার করার পক্ষে এটি তেমন বুদ্ধিমান মনে হয় না।

জাভা দিকটি বাস্তবায়নের জন্য অনেকগুলি সুবিধা রয়েছে বলে মনে হচ্ছে:

  • আইডিই + সংকলকটিতে হেলান দেওয়ার ক্ষমতা
  • কনস্ট্যান্ট বা এনামগুলি ব্যবহার করুন ("কুকুর" এবং "ছাল" এর জন্য), কোডের তুলনায় তারা অন্য কোথাও ব্যবহার করছেন এমন সম্ভাবনা রয়েছে ... যদি স্ট্রিংয়ের মান পরিবর্তিত হয় তবে এটি প্রতিটি মজাদারকে নিজেই প্রতিস্থাপন করতে আসল মজাদার fun কোড বেস
  • যথাযথ ডেটা নিয়ে প্রশ্নে পৃষ্ঠায় নেভিগেট না করে আমি ইউনিট পরীক্ষার সাহায্যে যুক্তি অনুশীলন করতে পারি

অপশন 1 এর পক্ষে আমি শুনেছি (স্ট্যাকের বাইরের) প্রধান আর্গুমেন্টগুলির মধ্যে একটি:

"আপনি যদি এই যুক্তিটিকে দৃশ্যে রাখেন তবে কোনও উপাদান যখন রেন্ডার করে তা দেখতে অনেক সহজ" "

আমি খুঁজে পেয়েছি যে এটির জীবনের প্রথম পর্যায়ে এটির হালকা ওজন এবং কম জটিল হওয়ার জন্যই এটি হতে পারে। তবে এই অনুশীলনটিকে বৃহত্তর স্কেলে প্রয়োগ করা এবং ছোট প্রয়োগ হিসাবে এটি শর্তসাপেক্ষে একটি ইঁদুরের বাসা তৈরি করে এবং এটি বজায় রাখার জন্য দুঃস্বপ্নে পরিণত হতে পারে। আমি বুনোতে যা দেখেছি তার অনুরূপ কয়েকটি উদাহরণ এখানে দেওয়া হল:

<h:outputText value="grrr" 
    render="#{animal.type == 'dog' or animal.type == 'cat' or animal.type == 'horse' 
        or animal.type == 'pony' or animal.type == 'mule' or animal.type == 'lion'
        or animal.type == 'tiger' or (animal.type == 'bird' 
        and animal.subType == 'macaw') or .... continue this for another line or two}"
/>

বা আমার প্রিয়, রেন্ডার শর্তযুক্ত একাধিক উপাদান ব্যবহার করে যা প্রদর্শিত হতে পারে বিভিন্ন মানকে উপস্থাপন করতে একে অপরের সাথে একচেটিয়া:

<h:outputText value="grr" render="#{theMonstrosityFromPreviousExample} />
<h:outputText value="cry" 
    render="#{animal.type == 'human' and animal.subType == 'baby'}" />
<h:outputText value="yo" 
    render="#{animal.type == 'human' and animal.subType == 'teenager'}" />
<h:outputText value="hello" 
    render="#{animal.type == 'human' and animal.subType == 'adult'}"/>

একবারে 4 টি পর্যন্ত পাঠ্য প্রদর্শিত হতে পারে? প্রথম নজরে আপনি বলতে পারবেন না, প্রতিটি শর্তের একটি চেক করা প্রয়োজন। পার্শ্ব নোট হিসাবে আমি বুঝতে পারি এই উদাহরণটিও খুব খারাপ নকশা, কারণ এগুলিকে এসি তে রাখা যেতে পারে: চয়ন করুন ... তবে আমি এটি আগে দেখেছি।

দিনের শেষে এটি তাত্ত্বিকভাবে এখনও 'ভিউ' যুক্তিযুক্ত কারণ এটি নির্ধারণ করে যে আসলে কী প্রদর্শিত হবে তাই এটি এক্সএইচটিএমএলে থাকা উচিত এমন একটি ধারণাগত যুক্তি রয়েছে। আমি যে সমস্যাটি পেয়েছি তা হ'ল ভিউ টেমপ্লেটে এই জাতীয় যুক্তি সহ দীর্ঘমেয়াদে বোঝা লেআউটটিকে আরও শক্ত করে তুলতে পারে এবং আমি এখনও দেখতে পেলাম যে সমস্যাটি সমাধানের এই পদ্ধতিটি জাভা ব্যবহারের ক্ষেত্রে কোনও আসল উপকারকে ধারণ করে শিম বাস্তবায়ন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.