java রহম জাভা স্টোরেজ বাস্তবায়ন করার সেরা উপায় কি?




বাংলা জাভা (23)

আমি এই ধরনের উদাহরণ দেখেছি:

public class MaxSeconds {
   public static final int MAX_SECONDS = 25;
}

এবং আমি তাদের স্ট্যাটিক চূড়ান্ত ঘোষণা, মধ্যে স্টোন মোড়ানো একটি কনস্ট্যান্ট ক্লাস থাকতে পারে অনুমিত। আমি কার্যত কোন জাভা জানি না এবং এই ধ্রুবক তৈরি করার সবচেয়ে ভাল উপায় যদি আমি বিস্মিত।


আমি যা বলছি তার সাথে একমত, স্টোনগুলির সংকলনের সাথে মোকাবিলা করার সময় এটি ব্যবহার করা সেরা। যাইহোক, যদি আপনি অ্যান্ড্রয়েডে প্রোগ্রামিং করছেন তবে একটি ভাল সমাধান: IntDef annotation

@Retention(SOURCE)
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST,NAVIGATION_MODE_TABS})
public @interface NavigationMode {}
public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;
...
public abstract void setNavigationMode(@NavigationMode int mode);
@NavigationMode
public abstract int getNavigationMode();

IntDef টীকাটি একটি সহজ উপায়ে ম্যানুয়াল থেকে উচ্চতর, এটি একটি কম্পাইল-টাইম মার্কার হিসাবে উল্লেখযোগ্যভাবে কম স্থান নেয়। এটি একটি বর্গ নয়, এবং এটি স্বয়ংক্রিয় স্ট্রিং-রূপান্তর সম্পত্তি নেই।


আমি ধ্রুবক পরিবর্তে getters ব্যবহার করতে পছন্দ। যারা public int getMaxConnections() {return 10;} ধ্রুবক মান ফিরে আসতে পারে, উদাহরণস্বরূপ public int getMaxConnections() {return 10;} , কিন্তু ধ্রুবক প্রয়োজন যে কিছু একটি গটার মাধ্যমে যেতে হবে।

এক সুবিধা হ'ল আপনার প্রোগ্রামটি ধ্রুবক বাড়িয়ে থাকলে - আপনি এটি কনফিগারযোগ্য হতে পারেন তা খুঁজে পেতে পারেন - আপনি কেবলমাত্র পরিবর্তনকারী ধ্রুবকটি কীভাবে পরিবর্তন করতে পারেন তা পরিবর্তন করতে পারেন।

অন্য সুবিধা হল ধ্রুবক সংশোধন করার জন্য আপনাকে এটি ব্যবহার করা সমস্ত কিছু পুনরায় কম্পাইল করতে হবে না। যখন আপনি একটি স্ট্যাটিক চূড়ান্ত ক্ষেত্র উল্লেখ করেন, তখন সেই ধ্রুবকটির মানটি যে কোন বাইটকোডে সংকলিত হয় যা উল্লেখ করে।


পার্থক্য কি

1।

public interface MyGlobalConstants {
    public static final int TIMEOUT_IN_SECS = 25;
}

2।

public class MyGlobalConstants {
    private MyGlobalConstants () {} // Prevents instantiation
    public static final int TIMEOUT_IN_SECS = 25;
}

এবং MyGlobalConstants.TIMEOUT_IN_SECS ব্যবহার করে যেখানেই আমরা এই ধ্রুবকটি প্রয়োজন। আমি উভয় একই মনে করি।


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

public, so that they are accessible from everywhere
static, so that they can be accessed without any instance. Since they are constants it
  makes little sense to duplicate them for every object.
final, since they should not be allowed to change

ইন্টারফেসগুলি সাধারণভাবে বাস্তবায়িত হওয়ার প্রত্যাশায় আমি কনস্ট্যান্টস অ্যাক্সেসর / বস্তুর জন্য একটি ইন্টারফেস ব্যবহার করব না। এই মজার চেহারা হবে না:

String myConstant = IMyInterface.CONSTANTX;

এর পরিবর্তে আমি কিছু ছোট ব্যবসার উপর ভিত্তি করে কয়েকটি ভিন্ন উপায়ে নির্বাচন করব, এবং তাই এটি আপনার প্রয়োজনের উপর নির্ভর করে:

1.  Use a regular enum with a default/private constructor. Most people would define 
     constants this way, IMHO.
  - drawback: cannot effectively Javadoc each constant member
  - advantage: var members are implicitly public, static, and final
  - advantage: type-safe
  - provides "a limited constructor" in a special way that only takes args which match
     predefined 'public static final' keys, thus limiting what you can pass to the
     constructor

2.  Use a altered enum WITHOUT a constructor, having all variables defined with 
     prefixed 'public static final' .
  - looks funny just having a floating semi-colon in the code
  - advantage: you can JavaDoc each variable with an explanation
  - drawback: you still have to put explicit 'public static final' before each variable
  - drawback: not type-safe
  - no 'limited constructor'

3.  Use a Class with a private constructor:
  - advantage: you can JavaDoc each variable with an explanation
  - drawback: you have to put explicit 'public static final' before each variable
  - you have the option of having a constructor to create an instance
     of the class if you want to provide additional functions related
     to your constants 
     (or just keep the constructor private)
  - drawback: not type-safe

4. Using interface:
  - advantage: you can JavaDoc each variable with an explanation
  - advantage: var members are implicitly 'public static final'
  - you are able to define default interface methods if you want to provide additional
     functions related to your constants (only if you implement the interface)
  - drawback: not type-safe

এটি আরও একটি পদক্ষেপ নিতে, আপনি ইন্টারফেসে বিশ্বব্যাপী ব্যবহৃত স্টোনগুলি স্থাপন করতে পারেন যাতে তারা সিস্টেমটিকে প্রশস্ত ব্যবহার করতে পারে। যেমন

public interface MyGlobalConstants {
    public static final int TIMEOUT_IN_SECS = 25;
}

কিন্তু তারপর বাস্তবায়ন না। শুধু সম্পূর্ণরূপে যোগ্যতাসম্পন্ন ক্লাসের নাম মাধ্যমে সরাসরি কোড তাদের পড়ুন।


আমি সম্মত যে একটি ইন্টারফেস ব্যবহার করার উপায় নেই। এই প্যাটার্ন এড়ানো ব্ললো এর কার্যকরী জাভাতে নিজস্ব আইটেম (# 18) এমনকি রয়েছে।

একটি যুক্তি ব্লক ধ্রুবক ইন্টারফেস প্যাটার্নের বিরুদ্ধে তোলে যে স্টোনগুলির ব্যবহার বাস্তবায়ন বিস্তারিত, কিন্তু তাদের ব্যবহার করার জন্য একটি ইন্টারফেস বাস্তবায়ন আপনার এক্সপোর্ট করা API এ বাস্তবায়ন বিস্তারিত প্রকাশ করে।

public|private static final TYPE NAME = VALUE; প্যাটার্ন একটি ধ্রুবক ঘোষণা একটি ভাল উপায়। ব্যক্তিগতভাবে, আমি মনে করি আপনার সমস্ত স্টোনটেন্টগুলি ঘরে আলাদা শ্রেণী তৈরি করা এড়ানো ভাল, তবে ব্যক্তিগত পছন্দ এবং শৈলী ব্যতীত অন্যথায় এটি না করার কারণে আমি কখনও কোনও কারণ দেখিনি।

যদি আপনার স্থিরতা একটি গণনার হিসাবে ভালভাবে মডেল করা যেতে পারে, 1.5 বা তার পরে উপলব্ধ http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html কাঠামো বিবেচনা করুন।

আপনি যদি 1.5 এর আগের সংস্করণটি ব্যবহার করেন তবে আপনি স্বাভাবিক জাভা ক্লাসগুলি ব্যবহার করে টাইপসফেয়ার এনমুরেশানগুলি টেনে আনতে পারেন। (যে আরো জন্য এই সাইট দেখুন)।


একটি একক, জেনারিক স্টোনেন্টস ক্লাস একটি খারাপ ধারণা। Constants তারা সবচেয়ে যুক্তিসঙ্গতভাবে সম্পর্কিত ক্লাস সঙ্গে একসঙ্গে গ্রুপ করা উচিত।

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


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

পরিবর্তে, সংস্থিতিকে অবশ্যই "মালিক" শ্রেণীর মধ্যে যেতে হবে। আপনার কি টাইমউট বলা একটি ধ্রুবক আছে? এটি সম্ভবত আপনার যোগাযোগ () বা সংযোগ () শ্রেণিতে যেতে হবে। MAX_BAD_LOGINS_PER_HOUR? ব্যবহারকারী () মধ্যে যায়। এবং তাই এবং তাই ঘোষণা.

অন্য সম্ভাব্য ব্যবহার হচ্ছে জাভা। প্রোপার্টি ফাইলগুলি যখন "স্থিরতা" রান-টাইমে সংজ্ঞায়িত করা যেতে পারে তবে সহজেই ব্যবহারকারী পরিবর্তনযোগ্য নয়। আপনি আপনার .jars এ এই প্যাকেজ আপ এবং ক্লাস সম্পদ লোডার সঙ্গে তাদের উল্লেখ করতে পারেন।


একটি ভাল বস্তু ভিত্তিক নকশা অনেক জনসাধারণের উপলব্ধ সংহত প্রয়োজন হবে না। সর্বাধিক সংস্থিতিকে অবশ্যই তাদের কাজের জন্য প্রয়োজনীয় ক্লাসে অন্তর্ভুক্ত করা উচিত।


কার্যকরী জাভা (২ য় সংস্করণ) -এ, এটি সুপারিশ করা হয়েছে যে আপনি স্থিরতার জন্য স্ট্যাটিক ইটগুলির পরিবর্তে enums ব্যবহার করুন।

এখানে জাভা এ Enums উপর একটি ভাল লেখা আছে: http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html

মনে রাখবেন যে প্রবন্ধের শেষে প্রশ্ন করা হয়েছে:

সুতরাং যখন আপনি enums ব্যবহার করা উচিত?

এর উত্তর দিয়ে:

যে কোন সময় আপনি সংস্থিত একটি নির্দিষ্ট সেট প্রয়োজন


যে পুরোপুরি গ্রহণযোগ্য, সম্ভবত এমনকি মান।

(public/private) static final TYPE NAME = VALUE;

যেখানে টাইপটি টাইপ হয়, NAME স্পেসগুলির জন্য আন্ডারস্কোর সহ সমস্ত ক্যাপের নাম এবং VALUE ধ্রুবক মান;

আমি অত্যন্ত তাদের নিজস্ব ক্লাস বা ইন্টারফেস আপনার স্টোনেন্ট নির্বাণ সুপারিশ।

একটি পার্শ্ব নোট হিসাবে: চূড়ান্ত ঘোষণা করা এবং পরিবর্তনযোগ্য যে পরিবর্তনশীল এখনও পরিবর্তন করা যেতে পারে; যাইহোক, পরিবর্তনশীল একটি ভিন্ন বস্তুর দিকে নির্দেশ করতে পারে না।

উদাহরণ স্বরূপ:

public static final Point ORIGIN = new Point(0,0);

public static void main(String[] args){

    ORIGIN.x = 3;

}

এটি বৈধ এবং ORIGIN তখন একটি পয়েন্ট (3, 0) হবে।


আমি এটির একটি উপায় হল ধ্রুব মানগুলির সাথে একটি 'গ্লোবাল' বর্গ তৈরি করে এবং ধ্রুবকগুলিতে অ্যাক্সেসের প্রয়োজন এমন ক্লাসগুলিতে স্ট্যাটিক আমদানি করি।


আমি static finalধ্রুবক ঘোষণা এবং ALL_CAPS নামকরণ নোটেশন সঙ্গে যেতে ব্যবহার করুন । আমি বেশ কয়েকটি বাস্তব জীবনের দৃষ্টান্ত দেখেছি যেখানে সমস্ত স্থিরতা একটি ইন্টারফেসে একত্রিত হয়। কয়েকটি পোস্ট সঠিকভাবে বলা হয়েছে যে একটি খারাপ অভ্যাস, প্রাথমিকভাবে কারণ এটির জন্য কোন ইন্টারফেস নেই। একটি ইন্টারফেস একটি চুক্তির প্রবর্তন করা উচিত এবং কোন সম্পর্কযুক্ত সংস্থিতিকে স্থাপন করা উচিত নয়। এটি এমন একটি শ্রেণিতে অন্তর্ভুক্ত করা উচিত যা তাত্ক্ষণিকভাবে (কোনও ব্যক্তিগত কন্সট্রাকটরের মাধ্যমে) খুব ভাল না হলে ধ্রুবক শব্দটি একটি নির্দিষ্ট শ্রেণির অন্তর্গত নয় ( স্প্যানিশ ভাষায়)। আমি সর্বদা ক্লাসে একটি ধ্রুবক রাখি যা এটি সম্পর্কিত, কারণ এটি জ্ঞান করে এবং সহজে রক্ষণযোগ্য।

Enums একটি পরিমান মানের প্রতিনিধিত্ব করার জন্য একটি ভাল পছন্দ, তবে যদি আপনি পরম মান (উদাঃ টাইমউইটি = 100 এমএস) এর উপর জোর দিয়ে একক স্টোনেন্টগুলি সংরক্ষণ করছেন তবে আপনি কেবল static finalপদ্ধতির জন্য যেতে পারেন ।


একটি কনস্ট্যান্ট, যেকোনো ধরনের, একটি শ্রেণীবিন্যাসের মধ্যে একটি অপরিবর্তনীয় সম্পত্তি তৈরি করে ঘোষণা করা যেতে পারে (যেটি final সংশোধনকারীর সাথে একটি সদস্য পরিবর্তনশীল)। সাধারণত static এবং public modifiers প্রদান করা হয়।

public class OfficePrinter {
    public static final String STATE = "Ready";  
}

অনেকগুলি অ্যাপ্লিকেশন রয়েছে যেখানে একটি ধ্রুবক মানটি পছন্দগুলির একটি এন-টিপল (উদাহরণস্বরূপ) থেকে একটি নির্বাচনকে নির্দেশ করে। আমাদের উদাহরণে, আমরা একটি নির্ধারিত প্রকার সংজ্ঞায়িত করতে পারি যা সম্ভাব্য নির্ধারিত মানগুলি (যেমন উন্নত টাইপ-সুরক্ষা ) সীমিত করবে:

public class OfficePrinter {
    public enum PrinterState { Ready, PCLoadLetter, OutOfToner, Offline };
    public static final PrinterState STATE = PrinterState.Ready;
}

এটি কেবলমাত্র ধ্রুবক রাখার জন্য ইন্টারফেসগুলি ব্যবহার করার জন্য একটি বিএড অনুশীলন (জোশ ব্লোক দ্বারা ক্রমাগত ইন্টারফেস প্যাটার্ন নামকরণ করা হয়)। জোশ এই পরামর্শ দিয়েছেন:

যদি স্টোনগুলি একটি বিদ্যমান ক্লাস বা ইন্টারফেসের সাথে দৃঢ়ভাবে আবদ্ধ থাকে তবে আপনাকে অবশ্যই ক্লাস বা ইন্টারফেসে যুক্ত করতে হবে। উদাহরণস্বরূপ, বক্সযুক্ত সংখ্যাসূচক আদিম ক্লাসগুলি, যেমন ইন্টিগ্রার এবং ডাবল, MIN_VALUE এবং MAX_VALUE সংস্থিতির সমস্ত রপ্তানি। যদি সংশ্লেষগুলিকে একটি গাণিতিক টাইপের সদস্যদের হিসাবে ভালভাবে দেখা হয় তবে আপনাকে এনাম টাইপ দিয়ে তাদের রপ্তানি করা উচিত। অন্যথায়, আপনি একটি noninstantiable উপযোগ ক্লাস সঙ্গে সংস্থিত রপ্তানি করা উচিত।

উদাহরণ:

// Constant utility class
package com.effectivejava.science;
public class PhysicalConstants {
    private PhysicalConstants() { }  // Prevents instantiation

    public static final double AVOGADROS_NUMBER   = 6.02214199e23;
    public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
    public static final double ELECTRON_MASS      = 9.10938188e-31;
}

নামকরণ কনভেনশন সম্পর্কে:

কনভেনশন অনুসারে, এই ক্ষেত্রগুলিতে আন্ডারস্কোর দ্বারা আলাদা শব্দগুলির সাথে মূলধন অক্ষরগুলি রয়েছে। এটি অত্যন্ত গুরুত্বপূর্ণ যে এই ক্ষেত্রগুলির মধ্যে অনাক্রম্য বস্তুগুলির আদিম মান বা রেফারেন্স রয়েছে।


Constants জন্য, Enum একটি ভাল পছন্দ IMHO হয়। এখানে একটি উদাহরণ

পাবলিক ক্লাস MyClass {

public enum myEnum {
    Option1("String1", 2), 
    Option2("String2", 2) 
    ;
    String str;
            int i;

            myEnum(String str1, int i1) { this.str = str1 ; this.i1 = i }


}

আমি নিম্নলিখিত পদ্ধতি ব্যবহার করি:

public final class Constants {
  public final class File {
    public static final int MIN_ROWS = 1;
    public static final int MAX_ROWS = 1000;

    private File() {}
  }

  public final class DB {
    public static final String name = "oups";

    public final class Connection {
      public static final String URL = "jdbc:tra-ta-ta";
      public static final String USER = "testUser";
      public static final String PASSWORD = "testPassword";

      private Connection() {}
    }

    private DB() {}
  }

  private Constants() {}
}

উদাহরণস্বরূপ, উদাহরণস্বরূপ, আমি ধ্রুবক পেতে Constants.DB.Connection.URL ব্যবহার করি। এটা আমার জন্য আরো "বস্তু orientally" দেখায়।


এটি মৌলিক স্থল-শূন্য মৌলবাদকে বোঝার ব্যতীত যিহোশূয় ব্লোককে উদ্ধৃত করার জন্য বিএডি অভ্যাস এবং ভয়ঙ্কর অভ্যাস অনুশীলন

আমি যাইহোক, যিহোশূয় Bloch কিছু পড়া না

  • তিনি একটি ভয়ানক প্রোগ্রামার
  • অথবা যতদূর পর্যন্ত আমি তাকে উদ্ধৃত করে পাচ্ছি (যিহোশূয় আমার মনে হয় এমন ছেলেটির নাম) কেবল তার উপাদানগুলি ধর্মীয় স্ক্রিপ্ট হিসাবে ব্যবহার করছেন যা তাদের সফ্টওয়্যার ধর্মীয় আনুগত্যের ন্যায্যতা প্রমাণ করে।

বাইবেলের মৌলবাদ হিসাবে সমস্ত বাইবেলের আইন দ্বারা সংক্ষেপিত করা যেতে পারে

  • আপনার সমস্ত হৃদয় এবং আপনার সমস্ত মন সঙ্গে মৌলিক পরিচয় ভালবাসা
  • নিজেকে হিসাবে আপনার প্রতিবেশী প্রেম

এবং একইভাবে সফটওয়্যার ইঞ্জিনিয়ারিং মৌলবাদ দ্বারা সংক্ষেপিত করা যেতে পারে

  • আপনার সব প্রোগ্রামিং এবং মনের সঙ্গে স্থল-শূন্য মৌলিক অনুভূতি নিজেকে উত্সর্গ করুন
  • এবং আপনার সহকর্মী প্রোগ্রামারদের শ্রেষ্ঠত্বের প্রতি উৎসর্গ করুন যেমন আপনি নিজের জন্য করবেন।

এছাড়াও, বাইবেলের মৌলবাদী চেনাশোনাগুলির মধ্যে একটি শক্তিশালী এবং যুক্তিসঙ্গত সহনশীলতা টানা হয়

  • প্রথমে নিজেকে ভালোবাসো. কারণ আপনি যদি নিজেকে বেশি ভালোবাসেন না তবে "আপনার প্রতিবেশীকে নিজের মতো ভালোবাসেন" ধারণাটি ওজন বহন করে না, যেহেতু "আপনি নিজের প্রতি কতটা ভালোবাসেন" সেটি হ'ল সেই দাতাম লাইন যার উপরে আপনি অন্যদের ভালোবাসবেন।

একইভাবে, যদি আপনি প্রোগ্রামার হিসাবে নিজের প্রতি শ্রদ্ধা না করেন এবং মূলসূত্রের প্রশ্ন না করেই কিছু প্রোগ্রামিং গুরু-নাথের ঘোষণা এবং ভবিষ্যদ্বাণী গ্রহণ করেন, তবে যিহোশূয় ব্লোক (এবং এর মত) আপনার উদ্ধৃতি এবং নির্ভরতা অর্থহীন। এবং তাই, আপনি আসলে আপনার সহকর্মী প্রোগ্রামারদের জন্য কোন সম্মান হবে।

সফ্টওয়্যার প্রোগ্রামিং মৌলিক আইন

  • অলসতা একটি ভাল প্রোগ্রামার এর গুণাবলী
  • আপনি আপনার প্রোগ্রামিং জীবনকে যত সহজ, অলস এবং যতটা সম্ভব কার্যকর হিসাবে সহজ করে তুলতে পারেন
  • আপনি আপনার প্রোগ্রামিং এর পরিণতি এবং প্রবেশগুলি সহজ, অলস এবং আপনার নেগবার-প্রোগ্রামারদের পক্ষে যতটা সম্ভব কার্যকর হিসাবে কাজ করে এবং আপনার প্রোগ্রামিং এন্ট্রিলগুলি চয়ন করুন।

ইন্টারফেস-প্যাটার্ন ধ্রুবক একটি খারাপ অভ্যাস ???

মৌলিকভাবে কার্যকরী এবং দায়িত্বশীল প্রোগ্রামিং কোন আইন অধীনে এই ধর্মীয় আদেশ পতিত হয়?

ইন্টারফেস-প্যাটার্ন স্টোনেন্টস ( https://en.wikipedia.org/wiki/Constant_interface ) এ কেবল উইকিপিডিয়া নিবন্ধটি পড়ুন , এবং ইন্টারফেস-প্যাটার্ন সংহতকারীদের বিরুদ্ধে এটি অযৌক্তিক অজুহাতগুলি পড়ে।

  • হ্যাটিফ-না আইডিই? কোন সফ্টওয়্যার প্রোগ্রামার হিসেবে পৃথিবীতে কে আইডিই ব্যবহার করবে না? আমাদের মধ্যে বেশিরভাগ প্রোগ্রামার যারা আইডিই ব্যবহার থেকে বিরত থাকাকালীন macho এ্যাসেটিক বেঁচে থাকা সততাবাদের প্রমাণ করতে চায় না।

    • এছাড়াও - একটি আইডিই প্রয়োজন না একটি উপায় হিসাবে মাইক্রো-ফাংশনাল প্রোগ্রামিং দ্বিতীয় সমর্থক অপেক্ষা করুন। আপনি তথ্য মডেল স্বাভাবিকীকরণ আমার ব্যাখ্যা পড়তে পর্যন্ত অপেক্ষা করুন।
  • ভেরিয়েবলের সাথে নেমস্পেসটি বর্তমান সুযোগের মধ্যে ব্যবহার করা হয় না? এটা এই মতামতের সমর্থক হতে পারে

    • সচেতন এবং তথ্য-মডেল স্বাভাবিকীকরণের প্রয়োজন নেই
  • স্টোরেজ প্রয়োগ করার জন্য ইন্টারফেস ব্যবহার ইন্টারফেসের অপব্যবহার। এর সমর্থকদের একটি খারাপ অভ্যাস আছে

    • যে "সংস্থিত" দেখতে না চুক্তি হিসাবে গণ্য করা আবশ্যক। এবং ইন্টারফেস প্রয়োগ বা চুক্তি সম্মতি প্রজেক্ট জন্য ব্যবহৃত হয়।
  • ভবিষ্যতে ইন্টারফেসগুলিকে বাস্তবায়িত ক্লাসগুলিতে রূপান্তর করা অসম্ভব না হলে এটি কঠিন। হাহ .... হুম্ম ... ???

    • কেন আপনি আপনার ধারাবাহিক জীবিকা হিসাবে প্রোগ্রামিং এর প্যাটার্ন জড়িত করতে চান? আরে, কেন নিজেকে এমন একটি অ্যাম্বুলভেন্ট এবং খারাপ প্রোগ্রামিং অভ্যাস দিতে?

অজুহাত যাই হোক না কেন, কার্যকরী সফ্টওয়্যার প্রকৌশলীর প্রতিনিধিত্ব বা সাধারণত ইন্টারফেস সংস্থিতির ব্যবহারকে নিরুৎসাহিত করার ক্ষেত্রে এটি কোনও কার্যকর সিদ্ধান্ত নয়।

যুক্তরাষ্ট্রের সংবিধান প্রণয়নকারী প্রতিষ্ঠাতা পিতাগুলির মূল উদ্দেশ্য এবং মানসিক অবস্থাগুলি কোন ব্যাপার না। আমরা প্রতিষ্ঠাতা পিতাদের মূল উদ্দেশ্য নিয়ে বিতর্ক করতে পারতাম কিন্তু আমি যা যত্নশীল তা হল মার্কিন সংবিধানের লিখিত বক্তব্য। এবং মার্কিন যুক্তরাষ্ট্রের সংবিধানের লিখিত সাহিত্য-মৌলবাদকে অকার্যকর প্রতিষ্ঠা-উদ্দেশ্যগুলি নয় এমন প্রতিটি মার্কিন নাগরিকের দায়িত্ব।

একইভাবে, আমি জাভা প্ল্যাটফর্মের প্রতিষ্ঠাতাদের "আসল" উদ্দেশ্যগুলি এবং প্রোগ্রামিং ভাষার ইন্টারফেসের জন্য কোনও কিছুর যত্ন নিই না। আমি যা যত্নশীল তা হল জাভা স্পেসিফিকেশন সরবরাহকারী কার্যকর বৈশিষ্ট্য এবং আমি সেই বৈশিষ্ট্যগুলিকে সম্পূর্ণরূপে কাজে লাগাতে চাই যা আমাকে দায়ী সফ্টওয়্যার প্রোগ্রামিং মৌলিক আইনগুলি পূরণ করতে সহায়তা করে। আমি "ইন্টারফেসের অভিপ্রায় লঙ্ঘন" অনুভূত হয় না যদি আমি যত্ন না। "জাভা ব্যবহার করার সঠিক উপায়" সম্পর্কে বলি নাকি গোসলিং বা কেউ ব্লক এই বিষয়ে আমার কোনও পার্থক্য নেই, যতক্ষণ না তারা যা বলে তা আমার কার্যকরী পরিপূরকগুলি কার্যকর করার প্রয়োজনীয়তা লঙ্ঘন করে না।

মৌলিক তথ্য-মডেল Normalization হয়

আপনার ডেটা-মডেল হোস্ট করা বা প্রেরিত হওয়া কোন ব্যাপার না। আপনি ইন্টারফেস বা enums বা whatevernots, রিলেশনাল বা নন-এসকিউএল ব্যবহার করেন, যদি আপনি তথ্য-মডেল স্বাভাবিকীকরণের প্রয়োজন এবং প্রক্রিয়া বুঝতে না।

আমাদের প্রথমে প্রক্রিয়াগুলির একটি সেটের ডেটা-মডেল সংজ্ঞায়িত এবং স্বাভাবিক করতে হবে। এবং যখন আমাদের একটি সুসংগত তথ্য-মডেল থাকে, তখনই আমরা কার্যকরী আচরণ এবং প্রক্রিয়াগুলিকে একটি ক্ষেত্র বা অ্যাপ্লিকেশনের ক্ষেত্রকে ব্লক করতে তার উপাদানগুলির প্রবাহ প্রবাহটি ব্যবহার করতে পারি। এবং শুধুমাত্র তারপর আমরা প্রতিটি কার্যকরী প্রক্রিয়ার API ব্যাখ্যা করতে পারেন।

EF Codd দ্বারা প্রস্তাবিত তথ্য স্বাভাবিকীকরণের দিকগুলিও এখন গুরুতরভাবে চ্যালেঞ্জযুক্ত এবং গুরুতরভাবে চ্যালেঞ্জযুক্ত। উদাহরণস্বরূপ, 1NF এর উপর তার বিবৃতিটি অস্পষ্ট, ভুলস্তলিত এবং সর্বাধিক সরল হিসাবে সমালোচনা করা হয়েছে, যেমন তার বাকি বিবৃতি বিশেষ করে আধুনিক ডেটা পরিষেবা, রেপো-প্রযুক্তি এবং সংক্রমণের আবির্ভাবের মতো। আইএমও, ইএফ কোডড স্টেটমেন্ট সম্পূর্ণরূপে ডিট করা উচিত এবং আরও গাণিতিকভাবে সম্ভাব্য বিবৃতিগুলির নতুন সেট ডিজাইন করা উচিত।

EF Codd এর একটি ঝলকানি ত্রুটি এবং কার্যকর মানবিক বোঝার জন্য তার ভুল আচরণের কারণ তার বিশ্বাস যে মানবিক অনুভূতযোগ্য বহু-মাত্রিক, পরিবর্তনযোগ্য-মাত্রা তথ্য টুকরা টুকরা 2-মাত্রিক ম্যাপিংয়ের একটি সেট দক্ষতার সাথে অনুভূত হতে পারে।

তথ্য স্বাভাবিকীকরণের মূলনীতি

কি EF Codd প্রকাশ করতে ব্যর্থ হয়েছে।

প্রতিটি সুসংগত তথ্য-মডেলের মধ্যে, এটি অর্জনের জন্য তথ্য-মডেল সঙ্গতির অনুক্রমিক স্নাতকের ক্রম।

  1. ঐক্য এবং তথ্য উদাহরণ সনাক্তকরণ।
    • প্রতিটি ডাটা উপাদানের গ্র্যানুলারিটি ডিজাইন করুন, যার মাধ্যমে তাদের গ্র্যানুলারিটি একটি পর্যায়ে রয়েছে যেখানে একটি উপাদানটির প্রতিটি উদাহরণটি অনন্যভাবে সনাক্ত করা এবং পুনরুদ্ধার করা যেতে পারে।
    • অনুপস্থিতি এলিয়াসিং অনুপস্থিতি। অর্থাৎ, কোন উপায়ে অস্তিত্ব নেই যার দ্বারা একটি উপাদান একটি উপাদান এর একাধিক উদাহরণ উত্পন্ন করে।
  2. উদাহরণ crosstalk অনুপস্থিতি। একটি উপাদান একটি উদাহরণ সনাক্ত করতে অবদান একটি উপাদান বা আরো একটি অন্যান্য উদাহরণ ব্যবহার করার প্রয়োজন নেই।
  3. তথ্য উপাদান / মাত্রা ঐক্য এবং পরিচয়।
    • উপাদান de-aliasing উপস্থিতি। একটি উপাদান / মাত্রা অনন্যভাবে সনাক্ত করা যেতে পারে যার দ্বারা একটি সংজ্ঞা বিদ্যমান থাকতে হবে। একটি উপাদান প্রাথমিক সংজ্ঞা যা;
    • যেখানে প্রাথমিক সংজ্ঞা উপ-পরিমাপ বা সদস্য-উপাদানগুলি প্রকাশ করতে পারে না যা একটি উদ্দেশ্যে উপাদানটির অংশ নয়;
  4. উপাদান dealiasing অনন্য উপায়। একটি উপাদান, এবং শুধুমাত্র একটি, একটি উপাদান জন্য যেমন উপাদান ডি-আলাইজিং সংজ্ঞা বিদ্যমান থাকতে হবে।
  5. উপাদানগুলির একটি অনুক্রমিক সম্পর্কের মধ্যে একটি অভিভাবক উপাদান সনাক্ত করার জন্য এক, এবং কেবল একটি, সংজ্ঞা ইন্টারফেস বা চুক্তি বিদ্যমান।
  6. উপাদান crosstalk অনুপস্থিতি। কোনও উপাদানটির নির্দিষ্ট সনাক্তকরণে অবদান রাখতে অন্য উপাদানটির সদস্য ব্যবহার করার প্রয়োজনীয়তা নেই।
    • এই ধরনের অভিভাবক-সন্তানের সম্পর্কের ক্ষেত্রে, পিতামাতার শনাক্তকারী সংজ্ঞাটি সন্তানের সদস্য উপাদানগুলির সেটের উপর নির্ভর করে না। পিতামাতার পরিচয় একটি সদস্য উপাদান একটি বা শিশুর সব বা শিশুদের উল্লেখ করার resorting ছাড়া সম্পূর্ণ সন্তানের পরিচয় হতে হবে।
  7. একটি তথ্য-মডেলের দ্বি-মোডাল বা মাল্টি-মোডাল উপস্থিতিগুলি প্রিমেট করুন।
    • যখন কোনও উপাদানটির দুটি প্রার্থীর সংজ্ঞা উপস্থিত থাকে, তখন এটি একটি সুস্পষ্ট চিহ্ন যে দুটি পৃথক ডাটা-মডেল বিদ্যমান হিসাবে বিদ্যমান। তার মানে ডেটা-মডেল স্তর বা ক্ষেত্রের স্তরে অসঙ্গতি রয়েছে।
    • অ্যাপ্লিকেশনের একটি ক্ষেত্র অবশ্যই এক এবং একমাত্র ডাটা-মডেল ব্যবহার করতে হবে।
  8. সনাক্ত এবং উপাদান পরিবর্তন সনাক্ত। আপনি বিশাল তথ্য পরিসংখ্যানগত উপাদান বিশ্লেষণ সঞ্চালিত না হওয়া পর্যন্ত, সম্ভবত আপনি দেখতে না, বা চিকিত্সা পরিবর্তন, চিকিত্সা প্রয়োজন দেখতে।
    • একটি তথ্য-মডেলের তার কিছু উপাদান চক্রবৃদ্ধি বা ধীরে ধীরে পরিবর্তিত হতে পারে।
    • মোড সদস্য-ঘূর্ণন বা স্থানান্তর-ঘূর্ণন হতে পারে।
    • সদস্য-ঘূর্ণন মিউটেশন উপাদানগুলির মধ্যে শিশু উপাদানগুলির স্বতন্ত্র সোয়াপিং হতে পারে। অথবা যেখানে সম্পূর্ণ নতুন উপাদান সংজ্ঞায়িত করা হবে।
    • ট্রান্সপোজিশনাল মিউটেশনটি একটি মাত্রিক-সদস্য হিসাবে একটি উপাদানে রূপান্তরিত হবে, বিপরীতভাবে।
    • প্রতিটি পরিবর্তন চক্র একটি স্বতন্ত্র তথ্য-মোড হিসাবে চিহ্নিত করা আবশ্যক।
  9. প্রতিটি mutation সংস্করণ। যেমন ডেটা মডেলের একটি পূর্ববর্তী সংস্করণটি খুঁজে বের করতে পারে, যখন সম্ভবত ডেটা মডেলের 8 বছরের পুরানো রূপান্তরটির জন্য প্রয়োজন হয়।

ইন্টার-সার্ভিসিং কম্পোনেন্ট-অ্যাপ্লিকেশনের একটি ক্ষেত্র বা গ্রিডে, এক এবং একমাত্র সুসংগত ডেটা-মডেল থাকতে হবে অথবা একটি ডেটা-মডেল / সংস্করণটির জন্য নিজেকে সনাক্ত করতে একটি উপায় থাকা আবশ্যক।

আমরা এখনও জিজ্ঞাসা করছি যদি আমরা ইন্টারফেস কনস্ট্যান্ট ব্যবহার করতে পারে? সত্যিই?

তথ্য-স্বাভাবিকীকরণের সমস্যাগুলি এই বৃহত্তর প্রশ্নটির চেয়ে বেশি ফলপ্রসূ বিষয়গুলি রয়েছে। আপনি যদি সেই সমস্যাগুলি সমাধান না করেন তবে আপনি যে ইন্টারফেস স্ট্রাকচারগুলি মনে করেন তা বিভ্রান্তিকর তুলনামূলকভাবে কিছুই নয়। Zilch।

ডাটা-মডেল স্বাভাবিকীকরণ থেকে আপনি উপাদানগুলিকে ভেরিয়েবল হিসাবে নির্ধারণ করুন, যেমনটি বৈশিষ্ট্য ইন্টারফেস সংশ্লেষ হিসাবে।

তারপর আপনি মান ইনজেকশন, সম্পত্তি কনফিগারেশন স্থানধারক, ইন্টারফেস, চূড়ান্ত স্ট্রিং, ইত্যাদি মধ্যে যা নির্ধারণ নির্ধারণ।

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

সম্ভবত আপনি একটি VCS রিলিজ মধ্যে তথ্য মডেল কম্পাইল করতে চান। আপনি একটি ডেটা-মডেলের একটি স্বতন্ত্রভাবে সনাক্তকরণযোগ্য সংস্করণ টেনে আনতে পারেন।

ইন্টারফেস সংজ্ঞায়িত মান সম্পূর্ণরূপে অ mutable হতে আশ্বাস দেওয়া হয়। এবং ভাগ্যযোগ্য। কেন আপনার ক্লাসের অন্য ক্লাস থেকে আপনার ক্লাসে চূড়ান্ত স্ট্রিংগুলির একটি সেট লোড করা হলে সেট স্টেশন সেট ??

তাই কেন এই একটি তথ্য মডেল চুক্তি প্রকাশ না? মানে আপনি যদি সাধারনভাবে পরিচালনা করতে পারেন এবং স্বাভাবিকভাবেই তা করতে পারেন তবে কেন? ...

public interface CustomerService {
  public interface Label{
    char AssignmentCharacter = ':';
    public interface Address{
      String Street = "Street";
      String Unit= "Unit/Suite";
      String Municipal = "City";
      String County = "County";
      String Provincial = "State";
      String PostalCode = "Zip"
    }

    public interface Person {
      public interface NameParts{
        String Given = "First/Given name"
        String Auxiliary = "Middle initial"
        String Family = "Last name"
      }
    }
  }
}

এখন আমি আমার অ্যাপস এর চুক্তিবদ্ধ লেবেলগুলিকে যেমন ভাবে উল্লেখ করতে পারি

CustomerService.Label.Address.Street
CustomerService.Label.Person.NameParts.Family

এই জার ফাইল বিষয়বস্তু বিভ্রান্ত? জাভা প্রোগ্রামার হিসেবে আমি জারের কাঠামোর যত্ন নিচ্ছি না।

এই osgi প্রেরিত রানটাইম swapping জটিলতা উপস্থাপন করে? Osgi প্রোগ্রামারদের তাদের খারাপ অভ্যাস অবিরত রাখতে অনুমতি একটি অত্যন্ত কার্যকর উপায়। Osgi চেয়ে ভাল বিকল্প আছে।

নাকি এটা না? প্রকাশিত চুক্তিতে ব্যক্তিগত কনস্ট্যান্টের কোন ফুটো নেই। সমস্ত ব্যক্তিগত সংস্থিতিকে "কনস্ট্যান্টস" নামে একটি ব্যক্তিগত ইন্টারফেসে গোষ্ঠীভুক্ত করা উচিত কারণ আমি স্থিরতার জন্য অনুসন্ধান করতে চাই না এবং আমি বার বার "ব্যক্তিগত চূড়ান্ত স্ট্রিং" টাইপ করতে খুব অলস।

public class PurchaseRequest {
  private interface Constants{
    String INTERESTINGName = "Interesting Name";
    String OFFICIALLanguage = "Official Language"
    int MAXNames = 9;
  }
}

সম্ভবত এমনকি এই:

public interface PurchaseOrderConstants {
  public interface Properties{
    default String InterestingName(){
       return something();
    }
    String OFFICIALLanguage = "Official Language"
    int MAXNames = 9;
  }
}

ইন্টারফেস স্ট্রাকচার প্রয়োগ করা হয় যখন বিবেচনা মূল্য ইন্টারফেস সংহত সঙ্গে একমাত্র সমস্যা।

এই ইন্টারফেসের "মূল উদ্দেশ্য" নয়? যেমন মার্কিন যুক্তরাষ্ট্রের সংবিধান প্রণয়ন করার জন্য সুপ্রিম কোর্ট মার্কিন সংবিধানের লিখিত চিঠিগুলি ব্যাখ্যা করবে তার পরিবর্তে আমি প্রতিষ্ঠিত পিতাদের "মূল উদ্দেশ্য" সম্পর্কে উদ্বিগ্ন হব।

সব পরে, আমি বিনামূল্যে জমি, বন্য এবং বন্য এর বাড়িতে বাস। সাহসী হতে, বিনামূল্যে হতে, বন্য হতে - ইন্টারফেস ব্যবহার করুন। যদি আমার সহকর্মী প্রোগ্রামাররা প্রোগ্রামিংয়ের দক্ষ এবং অলস মাধ্যমগুলি ব্যবহার করতে অস্বীকার করে তবে আমি কি তাদের সোশ্যাল রুলের দ্বারা তাদের সাথে সামঞ্জস্য করতে আমার প্রোগ্রামিং দক্ষতা কমিয়ে আনতে বাধ্য? সম্ভবত আমি উচিত, কিন্তু যে একটি আদর্শ পরিস্থিতি নয়।


শুধু একটি ইন্টারফেস ব্যবহার এড়াতে:

public interface MyConstants {
    String CONSTANT_ONE = "foo";
}

public class NeddsConstant implements MyConstants {

}

এটা প্রলুব্ধকর, কিন্তু encapsulation লঙ্ঘন এবং বর্গ সংজ্ঞা পার্থক্য blurs।


উপরোক্ত মন্তব্যগুলির উপর ভিত্তি করে আমি মনে করি এটি পুরনো ফ্যাশন গ্লোবাল ধ্রুবক শ্রেণী (সার্বজনীন স্ট্যাটিক চূড়ান্ত ভেরিয়েবল থাকা) পরিবর্তন করার পক্ষে এটির একটি ভাল পদ্ধতির মত, এটির মতো তার সমতুল্য সমতুল্য:

public class Constants {

    private Constants() {
        throw new AssertionError();
    }

    public interface ConstantType {}

    public enum StringConstant implements ConstantType {
        DB_HOST("localhost");
        // other String constants come here

        private String value;
        private StringConstant(String value) {
            this.value = value;
        }
        public String value() {
            return value;
        }
    }

    public enum IntConstant implements ConstantType {
        DB_PORT(3128), 
        MAX_PAGE_SIZE(100);
        // other int constants come here

        private int value;
        private IntConstant(int value) {
            this.value = value;
        }
        public int value() {
            return value;
        }
    }

    public enum SimpleConstant implements ConstantType {
        STATE_INIT,
        STATE_START,
        STATE_END;
    }

}

তাই আমি তাদের মত উল্লেখ করতে পারেন:

Constants.StringConstant.DB_HOST

FWIW, সেকেন্ডের মধ্যে একটি সময়সীমা সম্ভবত একটি কনফিগারেশন সেটিং (একটি বৈশিষ্ট্য ফাইল থেকে বা স্প্রিং হিসাবে ইনজেকশন মাধ্যমে পড়া) হতে হবে এবং একটি ধ্রুবক নয়।


আমি অত্যন্ত একটি স্ট্রাকচার ক্লাস থাকার বিরুদ্ধে পরামর্শ হবে। এটি সময়ে একটি ভাল ধারণা বলে মনে হতে পারে, কিন্তু যখন ডেভেলপারগুলি স্থির করে দস্তাবেজগুলি নথিভুক্ত করতে অস্বীকার করে এবং বর্গটি 500 স্থানাঙ্কের উপরে উঠে আসে যা একে অপরের সাথে সম্পর্কিত নয় (আবেদনটির সম্পূর্ণ ভিন্ন দিকগুলির সাথে সম্পর্কিত), এটি সাধারণত সম্পূর্ণ অপঠনীয় হচ্ছে সংস্থিত ফাইল মধ্যে সক্রিয়। পরিবর্তে:

  • যদি আপনার জাভা 5+ এ অ্যাক্সেস থাকে তবে অ্যাপ্লিকেশন এলাকার জন্য আপনার নির্দিষ্ট স্থির সংজ্ঞায়িত সংজ্ঞাগুলি ব্যবহার করুন। অ্যাপ্লিকেশন এলাকার সমস্ত অংশগুলি এই স্থিরতার জন্য নিখরচায় মানগুলি নয়, এনামগুলি উল্লেখ করতে হবে। আপনি একটি ক্লাস ঘোষণা কিভাবে অনুরূপ একটি enum ঘোষণা করতে পারেন। Enums সম্ভবত জাভা 5+ এর সবচেয়ে (এবং, যুক্তিযুক্ত, কেবল) দরকারী বৈশিষ্ট্য।
  • যদি আপনার এমন স্টেশন থাকে যা কোন নির্দিষ্ট শ্রেণির বা তার উপশ্রেণীগুলির একটিতে বৈধ তবে তাদের সুরক্ষিত বা জনসাধারণ হিসাবে ঘোষণা করুন এবং সেগুলিকে শ্রেণিকক্ষে শীর্ষ শ্রেণিতে রাখুন। এই উপায়ে, উপশ্রেণীগুলি এই ধ্রুবক মানগুলি অ্যাক্সেস করতে পারে (এবং যদি অন্য ক্লাসগুলি জনসাধারণের মাধ্যমে তাদের অ্যাক্সেস করে তবে স্টোনগুলি শুধুমাত্র একটি নির্দিষ্ট বর্গের জন্য বৈধ নয় ... যার মানে এই ধ্রুবক ব্যবহার করে বাহ্যিক ক্লাসগুলি খুব শক্তভাবে সংযুক্ত হতে পারে। ধ্রুবক ধারণকারী ক্লাস)
  • যদি আপনার আচরণকে সংজ্ঞায়িত ইন্টারফেসের সাথে ইন্টারফেস থাকে তবে মানগুলি বা আর্গুমেন্টের মানগুলি নির্দিষ্ট হওয়া উচিত তবে এটি সেই ইন্টারফেসের স্থিরতা সংজ্ঞায়িত করার জন্য পুরোপুরি গ্রহণযোগ্য, যাতে অন্যান্য প্রয়োগকারীর কাছে তাদের অ্যাক্সেস থাকবে। যাইহোক, স্ট্রাকচার ধরতে শুধু একটি ইন্টারফেস তৈরি এড়াতে: এটি শুধুমাত্র স্ট্রাকচার রাখা একটি শ্রেণির হিসাবে খারাপ হয়ে যেতে পারে।

ধ্রুবক হিসাবে আমি ক্লাসটিকে একইভাবে (আবরণ থেকে বাদে) কল করবো না ... আমার "সেটিংস", "মানগুলি" বা "কনস্ট্যান্টস" -এর সর্বনিম্ন এক শ্রেণিতে থাকতে হবে, যেখানে সমস্ত স্থিরতা থাকবে। আমার যদি বড় সংখ্যা থাকে তবে আমি তাদের যৌক্তিক ধ্রুবক ক্লাসগুলিতে যুক্ত করব (ব্যবহারকারী সেটিংস, অ্যাপস সেটিংস ইত্যাদি)





constants