Getters සහ Setters යුක්ති සහගත වන්නේ කවදාද?


180

ලබා ගන්නන් සහ සැකසුම් කරන්නන් බොහෝ විට විවේචනයට ලක් වන්නේ නිසි OO නොවන බවයි. අනෙක් අතට, මා දැක ඇති බොහෝ OO කේතයේ පුළුල් ලෙස ලබා ගන්නන් සහ සැකසුම් ඇත.

ලබා ගන්නන් සහ කට්ටල සාධාරණීකරණය කරන්නේ කවදාද? ඔබ ඒවා භාවිතා කිරීමෙන් වැළකී සිටීමට උත්සාහ කරනවාද? ඒවා පොදුවේ අධික ලෙස භාවිතා වේද?

ඔබගේ ප්‍රියතම භාෂාවට ගුණාංග තිබේ නම් (මගේ දේ) එවිට එවැනි දේ මෙම ප්‍රශ්නයට ගැණුම්කරුවන් සහ සැකසුම්කරුවන් ලෙසද සැලකේ. ඒවා OO ක්‍රමවේද දෘෂ්ටිකෝණයකින් එකම දෙයකි. ඔවුන් සතුව ඇත්තේ සින්ටැක්ස් ය.

Getter / Setter Critism සඳහා ප්‍රභවයන් (සමහර ඒවා වඩා හොඳ දෘශ්‍යතාවයක් ලබා දීම සඳහා අදහස් වලින් ගනු ලැබේ):

විවේචනය සරලව ප්‍රකාශ කිරීම සඳහා: වස්තුවෙන් පිටත සිට වස්තූන්ගේ අභ්‍යන්තර තත්වය හැසිරවීමට Getters සහ Setters ඔබට ඉඩ දෙයි. මෙය සංසරණය උල්ලං lates නය කරයි. එහි අභ්‍යන්තර තත්වය ගැන සැලකිලිමත් විය යුත්තේ වස්තුව පමණි.

කේතයේ ක්‍රියා පටිපාටික අනුවාදය.

struct Fridge
{
    int cheese;
}

void go_shopping(Fridge fridge)
{
     fridge.cheese += 5;
}

කේතයේ විකෘති අනුවාදය:

class Fridge
{
     int cheese;

     void set_cheese(int _cheese) { cheese = _cheese; }
     int get_cheese() { return cheese; }
 }

void go_shopping(Fridge fridge)
{
     fridge.set_cheese(fridge.get_cheese() + 5);        
}

නිසි සංවර්‍ධනයකින් තොරව ලබා ගන්නන් සහ සැකසුම්කරුවන් කේතය වඩාත් සංකීර්ණ කළේය. අභ්‍යන්තර තත්වයට වෙනත් වස්තූන් වෙත ප්‍රවේශ විය හැකි බැවින් මෙම ලබා ගන්නන් සහ සැකසුම් එකතු කිරීමෙන් අපට විශාල ප්‍රමාණයක් නොලැබේ.

ප්‍රශ්නය කලින් ගොඩගැසී ඇති ආකාරය පිළිබඳව සාකච්ඡා කර ඇත:


21
Getters and setters are often criticized as being not proper OOකරුණාකර උපුටා දැක්වීම.
රොබට් හාවි


45
@ ජොබ්, එයට කේත ඇති නිසා ඇයි? එය හොඳ ප්‍රශ්නයක් වන අතර බැරෑරුම් ලෙස සලකන්නේ නම් ශුද්ධ යුද්ධයේ පුනරාවර්තනයකි.
පීටර් ටර්නර්

2
In වින්ස්ටන් එවර්ට්: "... ප්‍රශ්නය වන්නේ ඔබ කිසිසේත් පංතිය තුළ ඇති දත්ත වලට ප්‍රවේශ විය යුතුද යන්නයි.": හොඳයි, සියලු සාමාජික විචල්‍යයන් සඳහා ලබා ගන්නන් සහ සැකසුම් ක්‍රියාත්මක කිරීමට කිසිවෙකු ඔබට බල කරන්නේ නැත, ඔබ ක්‍රියාත්මක කරන්නේ ඔබට අවශ්‍ය ඒවා පමණි. පොදු සාමාජික විචල්‍යයන් වෙනුවට ඔබ ගෙටර්ස් සහ සෙටර් භාවිතා කරන්නේ එබැවිනි.
ජෝර්ජියෝ

2
In වින්ස්ටන් එවර්ට්: ලබා ගන්නන් / සැකසුම්කරුවන් නොමැතිවීම මෙම ගැටළුව විසඳන්නේ කෙසේදැයි මම නොදනිමි: සෑම දත්ත කැබැල්ලකටම ප්‍රවේශ වීමට ක්‍රමයක් තිබිය යුතුය, එසේ නොමැතිනම් එය නිෂ් less ල ය; කේතයේ කුමන කොටසට ප්‍රවේශ විය හැකිද යන්න තීරණය කිරීම හොඳ සැලසුමක කාර්යයකි. යමෙක් නරක නිර්මාණකරුවෙකු නම් ඔහු හෝ ඇය එවැනි අය හෝ නැති අය සමඟ සිටිනු ඇත. මගේ ශත 2 යි.
ජෝර්ජියෝ

Answers:


163

ලබා ගන්නන් සහ සැකසුම් කරුවන් සිටීම වටපිටාව බිඳ දමන්නේ නැත. බ්‍රේක් එන්කැප්ලේෂන් යනු ස්වයංක්‍රීයව සෑම දත්ත සාමාජිකයෙකුටම (සෑම ක්ෂේත්‍රයකම , ජාවා භාෂාවෙන්) ලබා ගන්නෙකු සහ කට්ටලයක් එක් කිරීමකි . සියලුම දත්ත සාමාජිකයන් ප්‍රසිද්ධ කිරීමට වඩා මෙය හොඳ වුවත් එය කුඩා පියවරක් පමණි.

වටකර ගැනීමේ කාරණය නම්, වස්තුවෙන් පිටත සිට වස්තුවේ තත්වය දැන ගැනීමට හෝ වෙනස් කිරීමට ඔබට නොහැකි විය යුතුය, නමුත් එය සිදු කිරීම සඳහා ඔබට සාධාරණ ප්‍රතිපත්තියක් තිබිය යුතුය .

  • සමහර දත්ත සාමාජිකයන් සම්පූර්ණයෙන්ම වස්තුවට අභ්‍යන්තර විය හැකි අතර ඒවා ලබා ගන්නන් හෝ සැකසුම්කරුවන් නොතිබිය යුතුය.

  • සමහර දත්ත සාමාජිකයින් කියවීමට පමණක් විය යුතුය, එබැවින් ඔවුන්ට ලබා ගන්නන් අවශ්‍ය විය හැකි නමුත් සැකසුම්කරුවන් නොවේ.

  • සමහර දත්ත සාමාජිකයන් එකිනෙකාට අනුකූලව තබා ගැනීමට අවශ්‍ය විය හැකිය. එවැනි අවස්ථාවකදී ඔබ එක් එක් සඳහා කට්ටලයක් සපයන්නේ නැත, නමුත් ඒවා එකවර සැකසීම සඳහා තනි ක්‍රමයක් වන අතර එමඟින් ඔබට අනුකූලතාව සඳහා අගයන් පරීක්ෂා කළ හැකිය.

  • සමහර දත්ත සාමාජිකයන් වෙනස් කිරීමට අවශ්‍ය වන්නේ නිශ්චිත ප්‍රමාණයකින් වැඩි කිරීම හෝ අඩු කිරීම වැනි නිශ්චිත ආකාරයකින් පමණි. මෙම අවස්ථාවේ දී, ඔබ සැකසුමකට වඩා increment()සහ / හෝ decrement()ක්‍රමයක් සපයනු ඇත .

  • තවත් සමහරුන්ට ඇත්ත වශයෙන්ම කියවීමට-ලිවීමට අවශ්‍ය විය හැකි අතර, එය ලබා ගන්නෙකු සහ සැකසුම්කරුවෙකු සිටිය යුතුය.

A හි උදාහරණයක් සලකා බලන්න class Person. පුද්ගලයෙකුට නමක්, සමාජ ආරක්ෂණ අංකයක් සහ වයසක් ඇතැයි කියමු. මිනිසුන්ට ඔවුන්ගේ නම් හෝ සමාජ ආරක්ෂණ අංක වෙනස් කිරීමට අපි කිසිසේත් ඉඩ නොදෙන බව කියමු. කෙසේ වෙතත්, පුද්ගලයාගේ වයස සෑම වසරකම 1 කින් වැඩි කළ යුතුය. මෙම අවස්ථාවෙහිදී, ඔබ විසින් ලබා දී ඇති අගයන්ට නම සහ එස්එස්එන් ආරම්භ කරන ඉදිකිරීම්කරුවෙකු ලබා දෙන අතර එය වයස 0 දක්වා ආරම්භ කරනු ඇත. ඔබ ක්‍රමයක් ද සපයනු ඇත incrementAge(), එය වයස 1 කින් වැඩි කරයි. ඔබ ද සපයනු ඇත තුන්දෙනාටම ලබා ගන්නන්. මෙම නඩුවේ සැකසුම් අවශ්‍ය නොවේ.

මෙම සැලසුමේදී ඔබ වස්තුවේ තත්වය පන්තියට පිටතින් පරීක්ෂා කිරීමට ඉඩ දෙන අතර පන්තියට පිටතින් එය වෙනස් කිරීමට ඔබ ඉඩ දෙයි. කෙසේ වෙතත්, ඔබ අත්තනෝමතික ලෙස රාජ්‍යය වෙනස් කිරීමට ඉඩ නොදේ. ප්‍රතිපත්තියක් ඇත, එහි නම සහ එස්එස්එන් කිසිසේත් වෙනස් කළ නොහැකි බවත්, වරකට වයස අවුරුදු 1 කින් වැඩි කළ හැකි බවත් effectively ලදායී ලෙස සඳහන් කරයි.

දැන් අපි කියමු පුද්ගලයෙකුට ද වැටුපක් ඇත. මිනිසුන්ට කැමැත්ත පරිදි රැකියා වෙනස් කළ හැකිය, එයින් අදහස් වන්නේ ඔවුන්ගේ වැටුප ද වෙනස් වනු ඇති බවයි. මෙම තත්වය ආදර්ශනය කිරීම සඳහා අපට setSalary()ක්‍රමවේදයක් සැපයීම හැර වෙනත් මාර්ගයක් නැත ! කැමැත්ත පරිදි වැටුප වෙනස් කිරීමට ඉඩ දීම මෙම නඩුවේ පරිපූර්ණ සාධාරණ ප්‍රතිපත්තියකි.

මාර්ගය වන විට, ඔබේ ආදර්ශය, මම පන්ති ලබා දෙන Fridgeමෙම putCheese()සහ takeCheese()ක්රම වෙනුවට get_cheese()සහ set_cheese(). එවිට ඔබට තවමත් සංසරණය වනු ඇත.


public class Fridge {
  private List objects;
  private Date warranty;

  /** How the warranty is stored internally is a detail. */
  public Fridge( Date warranty ) {
    // The Fridge can set its internal warranty, but it is not re-exposed.
    setWarranty( warranty );
  }

  /** Doesn't expose how the fridge knows it is empty. */
  public boolean isEmpty() {
    return getObjects().isEmpty();
  }

  /** When the fridge has no more room... */
  public boolean isFull() {
  }

  /** Answers whether the given object will fit. */
  public boolean canStore( Object o ) {
    boolean result = false;

    // Clients may not ask how much room remains in the fridge.
    if( o instanceof PhysicalObject ) {
      PhysicalObject po = (PhysicalObject)o;

      // How the fridge determines its remaining usable volume is a detail.
      // How a physical object determines whether it fits within a specified
      // volume is also a detail.
      result = po.isEnclosedBy( getUsableVolume() );
    }

     return result;
  }

  /** Doesn't expose how the fridge knows its warranty has expired. */
  public boolean isPastWarranty() {
    return getWarranty().before( new Date() );
  }

  /** Doesn't expose how objects are stored in the fridge. */
  public synchronized void store( Object o ) {
    validateExpiration( o );

    // Can the object fit?
    if( canStore( o ) ) {
      getObjects().add( o );
    }
    else {
      throw FridgeFullException( o );
    }
  }

  /** Doesn't expose how objects are removed from the fridge. */
  public synchronized void remove( Object o ) {
    if( !getObjects().contains( o ) ) {
      throw new ObjectNotFoundException( o );
    }

    getObjects().remove( o );

    validateExpiration( o );
  }

  /** Lazily initialized list, an implementation detail. */
  private synchronized List getObjects() {
    if( this.list == null ) { this.list = new List(); }
    return this.list;
  }

  /** How object expiration is determined is also a detail. */
  private void validateExpiration( Object o ) {
    // Objects can answer whether they have gone past a given
    // expiration date. How each object "knows" it has expired
    // is a detail. The Fridge might use a scanner and
    // items might have embedded RFID chips. It's a detail hidden
    // by proper encapsulation.
    if( o implements Expires && ((Expires)o).expiresBefore( today ) ) {
      throw new ExpiredObjectException( o );
    }
  }

  /** This creates a copy of the warranty for immutability purposes. */
  private void setWarranty( Date warranty ) {
    assert warranty != null;
    this.warranty = new Date( warranty.getTime() )
  }
}

4
කරුණාකර මගේ ශීතකරණයේ උදාහරණය එතරම් බැරෑරුම් ලෙස නොසලකන්න. :) නියම ශීතකරණයක් බහාලුම් වස්තුවක් විය යුතුය, වස්තූන් හරියටම කුමක් දැයි කරදර නොවී ඒවා රඳවා ගන්නේ කෙසේදැයි දැන ගැනීමට මම බලාපොරොත්තු වෙමි. IE එය අරා ලැයිස්තුවක් මෙන් වනු ඇත. එය ශීතකරණයක් බවට පත් කරන්නේ කුමක් සඳහාද, එය ගබඩා කිරීමේදී වස්තූන් තැටියට අනුක්‍රමික කරයි යැයි කියමු. හරි. මගේ ශීතකරණයේ උදාහරණය බැරෑරුම් ලෙස සැලකීම ප්‍රමාණවත්.
වින්ස්ටන් එවර්ට්

6
නමුත් ශීතකරණයේ කල් ඉකුත්වීමේ දිනයන් දැනගත යුතු නොවේද, එවිට චීස් නරක අතට හැරී ඇති බවත් පිටතට විසි කළ යුතු බවත් ඔබට පැවසිය හැකිද? :) හරි, අපි මේක නවත්වන්න ඕන! :)
ඩීමා

10
ඔබ මෙහි ගොස් ඇති ෆ්‍රිජ් ලොජික් පිළිබඳ ඉතා රසවත් සාකච්ඡාවක් ...
මේසන් වීලර්

35
හහා, මම ඒ සඳහා දැන්වීම දැකීමට කැමතියි: "එය අලුත්ම ආකාරයේ ශීතකරණයක්: එහි නැති දෙයක් උදුරා ගැනීමට උත්සාහ කරන විට එය ඔබ වෙතට විසි කරයි! මේ ආකාරයෙන් ඔබ එය උත්සාහ කරන්නේ එක් වරක් පමණි! ඔබ කනස්සල්ලට පත්වේ ශීතකරණයේ පුරවා, නීති විරෝධී හැසිරීම ගැන ශීතකරණයේ කරදර වීමට ඉඩ දෙන්න!
ගැබ්ලින්

43
උදාහරණයේ සියල්ල වැරදිය. වයස් ක්ෂේත්‍රයක් හෝ setAge () ක්‍රමයක් නොතිබිය යුතුය. වයස යනු පුද්ගලයාගේ උපන්දිනයේ යම් කාල පරිච්ඡේදයකට සාපේක්ෂව ශ්‍රිතයකි. ඉතා සුළු දෙයක් ලෙස පෙනුනද, වස්තූන් හා වෙනත් නරක මෝස්තරවල පූර්ණ විකෘතිතාවයේ නවීන භාවිතයේ ඇති වැරැද්ද මෙයයි. පුද්ගලික ක්ෂේත්‍ර සඳහා ලබා ගැනීමේ / සැකසීමේ ක්‍රමවේදයන් හා එදිරිව සැබවින්ම විකෘති දේ, ක්ෂේත්‍රයක් යනු කුමක්ද, කුමන වස්තුව එහි හැසිරීම් සහ රාජ්‍ය වෙනස්කම් ඇත්ත වශයෙන්ම වලංගු වන්නේ කුමක් ද යන්න දැන සිටිය යුතුය (කුමන setX ක්‍රම සම්පූර්ණයෙන්ම විනාශ කරයි).
ඩැරල් ටීග්

42

ජාවා හි ලබා ගන්නන් සහ සැකසෙන්නන් සඳහා මූලික හේතුව ඉතා සරල ය:

  • ඔබ සඳහන් කළ හැකිය පමණක් ක්රම වන්නේ, ක්ෂේත්ර අතුරු මුහුණතක් දී.

එබැවින්, ඔබට ක්ෂේත්‍රයක් අතුරු මුහුණත හරහා යාමට ඉඩ දීමට අවශ්‍ය නම්, ඔබට පා er කයෙකු සහ ලේඛක ක්‍රමයක් අවශ්‍ය වේ. මේවා සාම්ප්‍රදායිකව x ක්ෂේත්‍රය සඳහා getX සහ setX ලෙස හැඳින්වේ.


45
එය භාෂා සීමාවකි. ඇත්තම ප්‍රශ්නය නම්, එම තත්වය හැසිරවීමට අප වෙනත් වස්තූන් වලට ඉඩ දිය යුතුද යන්නයි.
වින්ස්ටන් එවර්ට්

3
Et පීටර් ටර්නර්, පැහැදිලිවම භාෂාවක් ගුණාංග ඇතුළත් අතුරුමුහුණත් ඇතිවීම වළක්වයි. ආවරණ යටතේ getter / setter ලෙස හොඳින් ක්‍රියාත්මක කළ හැකි නමුත් ගුණාංග සඳහා අතුරු මුහුණත් අර්ථ දැක්වීම් සඳහා සහය එක් කිරීමට තරම් පහසු වනු ඇත.
වින්ස්ටන් එවර්ට්

2
In වින්ස්ටන්, ඇත්ත වශයෙන්ම වැඩ නිම කිරීම සඳහා පන්ති එකිනෙකා අතර තොරතුරු ඉදිරියට හා පසුපසට යැවීමට ඔබට අවශ්‍ය වනු ඇත. ඒ වෙනුවට ඔබ යෝජනා කරන්නේ කුමක්ද?

6
වස්තුවක් එයට ඉහළ මට්ටමේ අතුරු මුහුණතක් සැපයිය යුතුය. Getters සහ Setters පහත් මට්ටමේ අතුරු මුහුණතක් වේ. උදාහරණයක් ලෙස, ඔබට ද්විමය ගසක් ක්‍රියාත්මක කරන පන්තියක් ඇතැයි සිතමු. ගස සැරිසැරීම සඳහා ඔබට GetLeft (), GetRight (), GetValue () සහ GetKey () වැනි ක්‍රියාකාරකම් තිබිය හැකිය. නමුත් එය සම්පූර්ණයෙන්ම වැරදි ප්‍රවේශයයි. ඔබේ ද්විමය වෘක්ෂ පන්තිය විසින් Find, Insert, Delete වැනි මෙහෙයුම් සැපයිය යුතුය.
වින්ස්ටන් එවර්ට්

6
තවත් උදාහරණයක් ගැනීමට, ටෙට්රිස් කෑල්ලක් සලකා බලන්න. ටෙට්රිස් කැබැල්ලට block_type, භ්‍රමණය, පිහිටීම වැනි අභ්‍යන්තර තත්වයක් ඇත. ඔබට GetBlockType (), GetRotation (), GetPosition () වැනි ලබා ගන්නන් සිටිය හැකිය. නමුත් ඔබ එසේ නොකළ යුතුයි. ඔබට තිබිය යුත්තේ GetSquares () ක්‍රමයක් වන අතර එය මෙම කොටසෙහි ඇති සියලුම වර්ගවල ලැයිස්තුවක් ලබා දෙයි. ඔබට SetPosition () හෝ SetRotation () වැනි දේවල් ද නොතිබිය යුතුය. ඒ වෙනුවට, ඔබට MoveLeft (), MoveRight (), කරකවන්න (), වැටීම () වැනි මෙහෙයුම් තිබිය යුතුය.
වින්ස්ටන් එවර්ට්

20

Http://www.adam-bien.com/roller/abien/entry/encapsulation_violation_with_getters_and වෙතින්

ජාවාබීන් විලාසිතාව:

connection.setUser("dukie");
connection.setPwd("duke");
connection.initialize();

OO- විලාසිතාව:

connection.connect("dukie","duke");

හොඳයි, පැහැදිලිවම මම කැමති අවසාන ප්‍රවේශයටයි; එය ක්‍රියාත්මක කිරීමේ තොරතුරු ලේ ගැලීමක් නොකරයි, එය සරල හා වඩා සංක්ෂිප්ත ය, අවශ්‍ය සියලු තොරතුරු ක්‍රම ඇමතුම සමඟ ඇතුළත් කර ඇත, එබැවින් එය නිවැරදිව ලබා ගැනීම පහසුය. හැකි සෑම විටම ඉදිකිරීම්කරුගේ පරාමිතීන් භාවිතා කරමින් පුද්ගලික සාමාජිකයන් සැකසීමට මම කැමැත්තෙමි.

ඔබේ ප්‍රශ්නය නම්, ලබා ගන්නෙකු / සැකසීමක් සාධාරණීකරණය කරන්නේ කවදාද යන්නයි. සමහර විට මාදිලියේ වෙනසක් අවශ්‍ය වූ විට හෝ යම් තොරතුරක් සඳහා වස්තුවක් ප්‍රශ්න කිරීමට අවශ්‍ය වූ විට.

myObject.GetStatus();
myObject.SomeCapabilitySwitch = true;

ඒ ගැන සිතා බැලීමේදී, මම මුලින්ම C # හි කේතීකරණය ආරම්භ කළ විට, ඉහත දක්වා ඇති ජාවාබීන් විලාසිතාවේ කේත රාශියක් ලිවීය. නමුත් මම භාෂාවෙන් අත්දැකීම් ලබා ගන්නා විට, මම ඉදිකිරීම්කරු තුළ වැඩිපුර සාමාජිකයින් සැකසීමට පටන් ගත් අතර, ඉහත OO ශෛලියට සමාන ක්‍රම භාවිතා කළෙමි.


6
“සියලු තර්ක පරාමිතීන් ලෙස දෙන්න” OO- ශෛලිය වන්නේ ඇයි?

6
ඔබේ "OO- විලාසිතාව" විකල්ප 2 ක් හෝ 3 ක් සඳහා හොඳ වුවත්, ඔබ ඊට ඉහළින් ගිය පසු මම ජාවාබීන් විලාසිතාවට කැමතියි. හැකි සෑම පරාමිතියක් සඳහාම අධික ලෙස
පටවන ලද

1
LTheLQ: C # 4.0 මඟින් ඉදිකිරීම්කරු සහ ක්‍රම ඇමතුම් වල විකල්ප සහ නම් කරන ලද පරාමිතීන්ට ඉඩ දීමෙන් මෙය පහසු කරයි.
රොබට් හාවි

7
චතුර ලෙස කාරක රීති සමග Builder සඳහා මොකක්ද ඒ @TheLQ, උදා: බලන්න පේර ගේ සිතියම්සාදන්නා .
maaartinus

5
Or Thorbjørn Ravn Andersen, මම කියන්නේ "JavaBean setters අමතන්න" යන්නට වඩා "සියලු පරාමිතීන් පරාමිතීන් ලෙස ලබා දීම" OO ශෛලිය වඩා හොඳ බවයි. උදාහරණයේ ඇති සම්බන්ධක (..) ක්‍රමය භාවිතා කිරීමෙන් එවැනි උපකල්පනයක් සිදු නොවේ. සමහර විට ඔබ පරිශීලක සහ මුරපද ගුණාංග සකසා ඇත, සමහර විට ඔබ එසේ නොකරනු ඇත. වැදගත්ම දෙය නම් ඔබ නිවැරදි OO සංකල්පය කෙරෙහි අවධානය යොමු කිරීමයි: "සම්බන්ධ කරන්න" පණිවිඩය.
ඇන්ඩ්‍රස් එෆ්

14

ලබා ගන්නන් සහ කට්ටල සාධාරණීකරණය කරන්නේ කවදාද?

හැසිරීම "ලබා ගන්න" සහ "සැකසීම" ඇත්ත වශයෙන්ම ඔබේ ආකෘතියේ හැසිරීමට ගැලපෙන විට, එය ප්‍රායෝගිකව කිසි විටෙකත් නොවේ .

ව්‍යාපාරික වසමේ හැසිරීම පැහැදිලි නැති නිසා අනෙක් සෑම භාවිතයක්ම වංචාවකි.

සංස්කරණය කරන්න

එම පිළිතුර විචක්ෂණශීලී ලෙස පෙනෙන්නට ඇත, එබැවින් මට පුළුල් කිරීමට ඉඩ දෙන්න. ඉහත පිළිතුරු බොහෝ දුරට නිවැරදි නමුත් OO සැලසුමේ ක්‍රමලේඛන පරාමිතීන් කෙරෙහි අවධානය යොමු කරන්න. මගේ අත්දැකීම් අනුව මෙය OO ක්‍රමලේඛන භාෂාවන් සඳහා යම් අධ්‍යාපනික රීතියක් යැයි සිතීමට මිනිසුන් පෙළඹේ (උදා: මිනිසුන් සිතන්නේ දේපල වෙනුවට ආදේශ කරන්නන් ආදේශ කිරීම විශිෂ්ටයි)

ඇත්ත වශයෙන්ම එය සැලසුම් ක්‍රියාවලියේ ප්‍රති ence ලයකි. ඔබට අතුරු මුහුණත් හා සංවෘත හා රටාවන්ට සම්බන්ධ වීමට අවශ්‍ය නැත, එය මෙම පරාමිතීන් බිඳ දමන්නේද නැද්ද යන්න සහ හොඳ OO ක්‍රමලේඛනය යනු කුමක්ද යන්න පිළිබඳව තර්ක කරයි. අවසාන වශයෙන් වැදගත් වන එකම කරුණ නම්, ඔබේ වසම තුළ මේ ආකාරයට ක්‍රියා කරන කිසිවක් නොමැති නම් ඒවා ඔබ තුළට දමා ඔබේ වසම ආදර්ශනය නොකිරීමයි.

යථාර්ථය නම්, ඔබගේ ඩොමේන් අවකාශයේ ඇති ඕනෑම පද්ධතියකට ලබා ගන්නන් සහ සැකසුම් කරුවන් සිටීම බොහෝ දුරට අපහසු ය. ඔබට වැටුප් ගෙවීම සඳහා වගකිව යුතු පුරුෂයා හෝ ස්ත්‍රිය වෙත ඇවිද ගොස් "මෙම වැටුප X ලෙස සකසන්න" හෝ "මට මෙම වැටුප ලබා දෙන්න" යැයි සරලව කිව නොහැක. එවැනි හැසිරීම් සරලව නොපවතී

ඔබ මෙය ඔබගේ කේතයට ඇතුළත් කරන්නේ නම්, ඔබේ වසමේ ආකෘතියට ගැලපෙන පරිදි ඔබේ පද්ධතිය සැලසුම් නොකරයි. ඔව්, එය අතුරුමුහුණත් සහ සංසරණය බිඳ දමයි, නමුත් එය එසේ නොවේ. කාරණය වන්නේ ඔබ නොපවතින දෙයක් නිරූපණය කිරීමයි.

ඔබට වඩා බොහෝ විට වැදගත් පියවරක් හෝ ක්‍රියාවලියක් මග හැරී ඇත, මන්ද මට රෝල් ගෙවීමට නැගී සිට මෙම වැටුප X ලෙස සකසන්න යැයි කීමට හේතුවක් නොමැති නිසා විය හැකිය.

මිනිසුන් ලබා ගන්නන් සහ සැකසුම් භාවිතා කරන විට ඔවුන් මෙම ක්‍රියාවලිය සඳහා වන නීති වැරදි තැනකට තල්ලු කරයි. මෙය ඔබගේ වසමෙන් තවත් moving ත් වෙමින් පවතී. සැබෑ ලෝක ආදර්ශය භාවිතා කරමින්, එය හරියට අහඹු ලෙස ඇවිද ගිය පුද්ගලයාට මෙම අගයන් ලබා ගැනීමට අවසර ඇති බව උපකල්පනය කිරීම වැනි ය. එසේ නොවුවහොත් ඔහු ඒවා ඉල්ලන්නේ නැත. වසම කෙසේ ද යන්න පමණක් නොව, ඇත්ත වශයෙන්ම එය වසම කෙසේ දැයි බොරු ය.


පූර්ව පිළිතුරු 17 කින් පැහැදිලි කර ඇති කරුණු වලට වඩා සැලකිය යුතු කිසිවක් මෙය ඉදිරිපත් කරන බවක් නොපෙනේ
gnat

1
අනෙක් පිළිතුරු වස්තූන්, අතුරුමුහුණත් සහ වෙනත් භාෂා උපමා ගැන කථා කරයි. එය හොඳයි, නමුත් එය කේන්ද්‍රීය ප්‍රශ්නය නොවේ. ලබා ගන්නන් සහ සැකසුම් කරන්නන් නරක නැත, මන්ද ඔවුන් සමහර කේතීකරණ සම්මුතීන් බිඳ දැමූ නිසා නොව, මූලික වශයෙන් ඔබ නියෝජනය කරන සැබෑ ආකෘතියේ මෙම හැසිරීම ඔබට හමු නොවූ බැවිනි. මෙම කරුණ හොඳම කේතීකරණ භාවිතයන් පිළිබඳ සාකච්ඡාවේදී මග හැරී යයි.
කෝමාක් මුල්හෝල්

වැටුප් නොවේ නම් වැටුප් ගෙවීමේ අතුරු මුහුණත කුමක්දැයි ඔබ සිතන්නේ set/getකුමක්ද?
වින්ස්ටන් එවර්ට්

1
ඒවා බලය පැවරීමේ ස්ථර වටා ඔතා ඇතැම් බාහිර ආයතනවලට සීමා කර ඇත්නම් ඒවා ලබා ගන්නන් සහ සැකසුම්කරුවන් නොවේ. වැටුප් වෙනස් කරන වැටුප් දෙපාර්තමේන්තුවේ කිසිදු ක්‍රමයක් නොමැති බව මම නොකියමි, නමුත් එම ක්‍රමය සමාගම තුළම ක්‍රියාත්මක වන අභ්‍යන්තර ක්‍රියාවලීන් සමඟ පෙළගැස්විය යුතුය. උදාහරණයක් ලෙස බොහෝ සමාගම් කළමනාකරු විසින් බලය පවරනු ලබන සේවක කොන්ත්‍රාත්තුව මත පදනම්ව වැටුප් නියම කරයි. සේවකයාගේ වැටුප වෙනස් වුවහොත් නව කොන්ත්‍රාත්තුවක් සකස් කර කළමනාකරුවෙකු එය අත්සන් කළ යුතුය. එබැවින් වැටුප් ලේඛනය කොන්ත්‍රාත් වස්තුවක් සහ යම් අවසර ලත් වස්තුවක් වැටුප්
ලේඛනය

3
නැතහොත් වෙනත් ආකාරයකින් කිවහොත්, set_salary (new_salary, employee_id) සහ බලයලත්_සාලරි_අප්ඩේට් (සේවක_ කොන්ත්‍රාත්තුව, බලයලත්_ කළමනාකරු) අතර තරමක් වෙනසක් ඇත. මෙම ක්‍රියාවලිය අභ්‍යන්තර ව්‍යාපාරික ක්‍රියාවලිය ආදර්ශනය කළ යුතුය
Cormac Mulhall

11

සාමාන්‍ය රීතියක් ලෙස, ලබා ගන්නන් සහ සැකසුම් කරන්නන් නරක අදහසකි. ක්ෂේත්‍රයක් තාර්කිකව අතුරුමුහුණතේ කොටසක් නොවන්නේ නම් සහ ඔබ එය පුද්ගලික කළහොත් එය හොඳයි. එය තාර්කිකව අතුරුමුහුණතේ කොටසක් වන අතර ඔබ එය ප්‍රසිද්ධ කළහොත් එය හොඳයි. නමුත් ඔබ එය පුද්ගලීකරණය කර නැවත හැරී එය get ලදායි ලෙස ප්‍රසිද්ධ කරන්නෙකු සහ සැකසුමක් ලබා දෙන්නේ නම්, ඔබේ කේතය දැන් වඩාත් වාචික හා අපැහැදිලි වනවා හැර ඔබ ආරම්භ කළ ස්ථානයට නැවත පැමිණේ.

නිසැකවම, ව්යතිරේක පවතී. ජාවා හි, ඔබට අතුරුමුහුණත් භාවිතා කිරීමට අවශ්‍ය විය හැකිය. ජාවා සම්මත පුස්තකාලයට පසුගාමී අනුකූලතා අවශ්‍යතා ඇති අතර කේතයේ ගුණාත්මකභාවය පිළිබඳ සාමාන්‍ය මිනුම් ඉක්මවා යයි. ඔබ ඇත්ත වශයෙන්ම පුරාවෘත්තීය නමුත් දුර්ලභ අවස්ථාව සමඟ ගනුදෙනු කිරීමට ඉඩ ඇති අතර හොඳ අවස්ථාවක් තිබේ නම් ඔබට පසුව ගබඩා කළ ක්ෂේත්‍රයක් මැස්සන් ගණනය කිරීම මඟින් වෙනත් ආකාරයකින් අතුරු මුහුණත බිඳ දැමිය නොහැක. නමුත් මේවා ව්යතිරේක වේ. Getters සහ setters යනු විශේෂ සාධාරණීකරණය අවශ්‍ය වන ප්‍රති-රටාවකි.


6
ලබා ගන්නෙකු සහ සැකසුම්කරුවෙකු අදහස් කරන්නේ ගුණාංගය මිස ක්ෂේත්‍රය නොව අතුරු මුහුණතේ කොටසක් බවයි. GetBirthDate () සහ SetBirthDate () "yyyy / mm / dd" ගනී යැයි සිතමු, නමුත් ගබඩා කර ඇති ක්ෂේත්‍රය 01/01/1000 සිට දින ගණන වේ. ඔබට එය 01/01/0001 ලෙස වෙනස් කළ හැකි අතර, ලබා ගන්නා තැනැත්තා සහ සැකසුම්කරු අතුරු මුහුණත එලෙසම තබා ගනී. විශේෂයෙන් 'පොදු' යන්නෙන් ප්‍රසිද්ධියේ ඉවත දැමිය හැකි බැවින් විචල්‍යයන් කිසි විටෙකත් පොදු නොවිය යුතුය. එන අගය වලංගු කිරීම, අදාළ ඕනෑම ක්ෂේත්‍රයක් යාවත්කාලීන කිරීම, අවශ්‍ය පරිදි පරිවර්තනය කිරීම යනාදිය සඳහා සෑම විටම සෙටරයක් ​​භාවිතා කරන්න. අභ්‍යන්තර ආචයනය වෙනස් වුවහොත් ලබා ගන්නෙකු භාවිතා කිරීමට උත්සාහ කරන්න.
ඇන්ඩි කැන්ෆීල්ඩ්

Nd ඇන්ඩි කැන්ෆීල්ඩ් යනු පොදු යැයි කීමට තරමක් ශක්තිමත් වන අතර එය ප්‍රසිද්ධියේ ඉවත දැමිය හැකි ය. එය එසේ වන්නේ ඔබ එය නරක ලෙස වැඩසටහන් කළහොත් පමණි. ඔබ සතුව කට්ටලයක් තිබේ නම් සහ වැරදි අගයක් ඒ වෙත යවනු ලැබේ නම්, ඔබට වැඩසටහන කුණු කසළ ලෙස හැඳින්විය හැකි ව්‍යතිරේකයක් විසි කළ හැකි නමුත් එය දෝෂයක් සමඟ ඉවත්ව යයි. තවද වස්තුව භාවිතා කරන්නාට විචල්‍ය අගයක් ලබා දිය හැකි නම් එය වැරදියි අගය එවිට ඔබට එය මතකයේ තබාගෙන එය පරීක්‍ෂා කළ හැකිය. "ආහ්, නමුත් මට කළ යුතුව ඇත්තේ මම පරීක්‍ෂකයක් භාවිතා කරන්නේ නම් 1 පරීක්‍ෂණයක් පමණි", නමුත් සමහර විට ඔබේම කේතය මඟින් විචල්‍යයට නරක අගයක් ලබා දෙයි. පරීක්ෂණ සමඟ ඔබේ test.n අඩු කරන්න, ඔබේ ප්‍රෝග් "
කුණු කූඩයට

3

ක්ෂේත්‍රය සෘජුව හෝ ක්‍රමවේදය හරහා ලබා ගත හැකිද යන්න යථාර්ථවාදී නොවේ.

පන්ති වෙනස්වීම් (ප්‍රයෝජනවත් ඒවා) වැදගත් ය. ඒවා ආරක්ෂා කර ගැනීම සඳහා අපට සමහර විට පිටතින් යමක් වෙනස් කිරීමට නොහැකි විය යුතුය. උදා. අපට පන්ති චතුරස්රය සෙපරෙට් පළල සහ උස සහිත නම්, ඒවායින් එකක් වෙනස් කිරීමෙන් එය වර්ගයට වඩා වෙනත් දෙයක් බවට පත්වේ. එබැවින් අපට ක්‍රමවේදය වෙනස් කිරීම අවශ්‍ය වේ එය සෘජුකෝණාස්රය නම්, අපට සැකසුම් / පොදු ක්ෂේත්‍ර තිබිය හැකිය. නමුත් ශුන්‍යයට වඩා විශාල නම් වඩා හොඳ දැයි පරීක්ෂා කිරීමට වඩා සෙටර්.

කොන්ක්‍රීට් භාෂාවලින් (උදා: ජාවා) අපට එම ක්‍රම (අතුරුමුහුණත්) අවශ්‍ය වීමට හේතු වේ. ක්‍රමයට තවත් හේතුවක් වන්නේ අනුකූලතාව (ප්‍රභවය සහ ද්විමය) ය. එබැවින් ඒවා එකතු කිරීම පහසු වන අතර පසුව පොදු ක්ෂේත්‍රය ප්‍රමාණවත් දැයි සිතා බලන්න.

btw. පොදු අවසාන ක්ෂේත්‍ර සමඟ සරල වෙනස් කළ නොහැකි වටිනාකම් සහිත පන්ති භාවිතා කිරීමට මම කැමතියි.


මෙය වළක්වා ගත යුතු එකම දෙයයි. ක්ෂේත්රයේ සිට දේපල / ලබා ගන්නන් / සැකසුම්කරු වෙත යාම බොහෝ භාෂාවල කැපී පෙනෙන වෙනසක් වේ.
ඩෝසු මහතා

2

අතුරුමුහුණත් එකම මට්ටමක තබා ගනිමින් ඔබේ අභ්‍යන්තරය ඕනෑම දෙයකට වෙනස් කිරීමට ඔබට අවශ්‍ය විය හැකිය. ඔබගේ අතුරුමුහුණත් වෙනස් නොවේ නම්, ඔබ කේතය කැඩී යන්නේ නැත. ඔබට තවමත් ඔබේ අභිමතය පරිදි ඔබේ අභ්‍යන්තරය වෙනස් කළ හැකිය.


1
මට පුදුමයි මේ පිළිතුර මෙතරම් පහළට. ඔබගේ පවතින ඒපීඅයි එක කඩ නොකර අනාගතයේදී තවත් බොහෝ දේ කිරීමට (උදා: සිදුවීමක් ගිනි තැබීම, වැඩි ආදාන වලංගු කිරීමක්, අභ්‍යන්තර පොත් තැබීම කරන්න) ලබා ගන්නන් සහ සැකසුම් කරන්නන් ඔබට ඉඩ දෙයි. පොදු නොවන කේත සමඟ වුවද, ඔබට වෙනස් කළ යුතු API අඩුය, යාවත්කාලීන කිරීමට ඇති පරායත්තතා අඩුය, සහ එම යාවත්කාලීනයන් සෑදීමේදී හඳුන්වා දුන් දෝෂ අඩුය.
AmadeusDrZaius

0

මගේ ප්‍රවේශය මෙයයි -

පසුකාලීනව දත්ත සමඟ සම්බන්ධ වීමට මා බලාපොරොත්තු වන විට, ලබා ගන්නෙකු / සැකසීමක් සාධාරණීකරණය කරයි. එසේම, වෙනසක් සිදුවන්නේ නම්, මම බොහෝ විට දත්ත ලබා ගන්නෙකු / සැකසුමකට තල්ලු කරමි.

එය POD ව්‍යුහයක් නම්, මම ලබා ගත හැකි ස්ථාන තබමි.

වඩාත් වියුක්ත මට්ටමින්, ප්‍රශ්නය වන්නේ "දත්ත කළමනාකරණය කරන්නේ කවුද" යන්නයි, එය ව්‍යාපෘතිය මත රඳා පවතී.


0

Getters සහ setters භාවිතා කිරීම සංකීර්ණ යැයි හැඟේ නම්, ගැටළුව භාෂාව විය හැකිය, සංකල්පයම නොවේ.

රූබි හි ලියා ඇති දෙවන උදාහරණයේ කේතය මෙන්න :

class Fridge
  attr_accessor :cheese
end

def go_shopping fridge
  fridge.cheese += 5
end

එය ජාවා හි පළමු උදාහරණය මෙන් පෙනේ. ලබා ගන්නන් සහ කට්ටල පළමු පන්තියේ පුරවැසියන් ලෙස සලකන විට, ඔවුන් භාවිතා කිරීමට සුදුසු වැඩක් නොවන අතර, එකතු කළ නම්‍යතාවය සමහර විට සැබෑ ආශීර්වාදයක් විය හැකිය - නිදසුනක් ලෙස, නව ශීතකරණයක් මත චීස් සඳහා පෙරනිමි අගයක් ආපසු ලබා දීමට අපට තීරණය කළ හැකිය:

class Fridge
  attr_accessor :cheese

  def cheese
    @cheese || 0
  end
end

ඇත්ත වශයෙන්ම ප්‍රසිද්ධියේ නිරාවරණය නොකළ යුතු බොහෝ විචල්‍යයන් ඇත. අභ්‍යන්තර විචල්‍යයන් අනවශ්‍ය ලෙස නිරාවරණය කිරීමෙන් ඔබේ කේතය වඩාත් නරක අතට හැරෙනු ඇත, නමුත් ඔබට එය ලබා ගන්නන් සහ සැකසුම් කරුවන්ට දොස් පැවරිය නොහැක.


එය ලස්සනට ප්‍රකාශ කර ඇත. වට්ටෝරුව ක්‍රමයෙන් ගොඩනඟන අතරතුර අපට වෙනස් කළ නොහැකි වස්තූන් නිර්මාණය කිරීමට අවශ්‍ය නිසා බිල්ඩර් කාර්යයන් එකතු කරන ලදි: සමහර විට ඔබ කෘතිම රසකාරකයක් එකතු කරන්නේ නම්, ඔබට සීනි එකතු කිරීම අවශ්‍ය නොවේ. නම් කරන ලද පරාමිතීන් භාවිතා කිරීම, සහ අධික ලෙස පැටවීම සමඟ වුවද, සියල්ලම කරමින් එක් ක්‍රමයක් ගොඩ නැගීම ඉතා අපහසුය. ඇත්ත වශයෙන්ම ජාවාහි පරාමිතීන් නම් කර නැත, එබැවින් මිනිසුන් බිල්ඩර් රටාව භාවිතා කිරීමට තවත් එක් හේතුවක් තිබේ.
යෝයෝ

0

Sizeපළල සහ උස ආවරණය කරන පන්තියක් සලකා බලන්න . ඉදිකිරීම්කරු භාවිතා කිරීමෙන් මට සැකසුම් ඉවත් කළ හැකි නමුත් එය සෘජුකෝණාස්රයක් ඇඳීමට මට උපකාර කරන්නේ Sizeකෙසේද? පළල සහ උස පන්තියට අභ්‍යන්තර දත්ත නොවේ; ඒවා බෙදාගත් දත්ත ප්‍රමාණයේ පාරිභෝගිකයින්ට තිබිය යුතුය.

වස්තූන් හැසිරීම් සහ රාජ්‍ය - හෝ ගුණාංග වලින් සමන්විත වේ. නිරාවරණය වූ තත්වයක් නොමැති නම්, හැසිරීම් පමණක් පොදු වේ.

තත්වය නොමැතිව, ඔබ වස්තු එකතුවක් වර්ග කරන්නේ කෙසේද? වස්තුවක නිශ්චිත අවස්ථාවක් ඔබ සොයන්නේ කෙසේද? ඔබ ඉදිකිරීම්කරුවන් පමණක් භාවිතා කරන්නේ නම්, ඔබේ වස්තුවට දිගු ලක්ෂණ ලැයිස්තුවක් ඇති විට කුමක් සිදුවේද?

වලංගු කිරීමකින් තොරව කිසිඳු ක්‍රම පරාමිතියක් පරිභෝජනය නොකළ යුතුය. එබැවින් ලිවීම කම්මැලිකමකි:

setMyField(int myField){
    this.myField = myField;
}

ඔබ එය එසේ ලියන්නේ නම්, ඔබ අවම වශයෙන් වලංගු කිරීම සඳහා කට්ටලය භාවිතා කිරීමට සූදානම් කර ඇත; එය පොදු ක්ෂේත්‍රයකට වඩා හොඳයි - නමුත් යන්තම්. නමුත් අවම වශයෙන් ඔබට ස්ථාවර මහජන අතුරු මුහුණතක් ඇති අතර ඔබේ ගනුදෙනුකරුවන්ගේ කේතය කඩ නොකර නැවත පැමිණ වලංගු කිරීමේ නීති රීති දැමිය හැකිය.

ලබා ගන්නන්, සැකසුම් කරන්නන්, දේපල, විකෘති, ඔබ කැමති දේ ඔවුන් අමතන්න, නමුත් ඒවා අවශ්‍ය වේ.


නමුත් අවම වශයෙන් ඔබට ස්ථාවර මහජන අතුරු මුහුණතක් ඇති අතර ඔබේ ගනුදෙනුකරුවන්ගේ කේතය කඩ නොකර නැවත පැමිණ වලංගු කිරීමේ නීති රීති දැමිය හැකිය. එය සත්‍යයක් නොවේ. වලංගු කිරීමේ නීති තව දුරටත් පාරට එක් කිරීමෙන් "ඔබේ ගනුදෙනුකරුවන්ගේ කේතය බිඳ දැමිය හැකිය". නිදසුනක් ලෙස intනිදර්ශන විචල්‍යයක් ගෙන, වලංගු නොවන අගයන් පමණක් පිළිගැනීම සඳහා වලංගු කිරීමේ රීතියක් එක් කිරීමට ඔබ තීරණය කළ බව සිතන්න. ගැටළුව වන්නේ ඔබේ ගනුදෙනුකරුගේ කේතය දැනටමත් එය negative
ණ අගයකට සැකසීමේ

0

ලබා ගන්නන් සහ සැකසුම්කරුවන් සංසරණය සහ සත්‍ය OO උල්ලං If නය කරන්නේ නම්, මම බරපතල කරදරයක වැටී සිටිමි.

මට සෑම විටම දැනුනේ වස්තුවක් ඔබට කළ යුතු හොඳම දේ මතකයට එන ඕනෑම දෙයක් නියෝජනය කරන බවයි.

මම මේ වන විට ජාවා හි Mazes ජනනය කරන වැඩසටහනක් ලිවීම අවසන් කර ඇති අතර මට "Maze Square" නියෝජනය කරන පන්තියක් ඇත. ඛණ්ඩාංක, බිත්ති සහ බූලියන් ආදිය නියෝජනය කරන දත්ත මෙම පන්තියේ මා සතුව ඇත.

මෙම දත්ත වෙනස් කිරීමට / හැසිරවීමට / ප්‍රවේශ වීමට මට යම් ක්‍රමයක් තිබිය යුතුය! ලබා ගන්නන් සහ සැකසුම් කරුවන් නොමැතිව මා කුමක් කළ යුතුද? ජාවා දේපල භාවිතා නොකරන අතර මෙම පන්තියට අයත් මගේ සියලු දත්ත මහජනයාට සැකසීම නිශ්චිතවම සංසරණය සහ OO උල්ලං violation නය කිරීමකි.


6
මෙන්න ප්‍රශ්නය: ඔබ එම ක්ෂේත්‍ර සියල්ලම ප්‍රසිද්ධ කර, සහ ලබා ගන්නන් සහ සැකසුම් භාවිතා කිරීම නැවැත්වුවහොත් ඔබේ කේතය වෙනස් වන්නේ කෙසේද?
වින්ස්ටන් එවර්ට්

න්‍යාය අනුව, එය එසේ නොවේ. එම අවස්ථාවේදී පන්තියක් පවා කරන්නේ ඇයි? ඕනෑම දෙයක් සමඟ එකම තර්කයක් ඉදිරිපත් කළ හැකිය. නමුත් මගේ පහළ පෝස්ට් එක එය වඩාත් අලංකාර ලෙස පවසා ඇති බව පෙනේ. (. Getters හා ස්ථානගත වන්නන් ආරක්ෂිතව වස්තුවක් අගය දීමට ක්රමයක් වන අතර, හෝ වස්තුවක් සිට අගය ලබා) පශ්චාත් .. යනවා
බ්රයන් හැරින්ටන්

3
මම පෙන්වා දෙමි: එම පෝස්ටරය අවසානයේ මා සමඟ එකඟ වී ඒ සඳහා තවත් පිළිතුරක් පළ කළේය. අත්යවශ්යයෙන්ම, getters සහ setters භාවිතා කිරීම දත්ත කෙලින්ම හැසිරවීමට සමාන වේ. එසේ කිරීමෙන් ඔබ ඇත්ත වශයෙන්ම OOness ලබා ගන්නේ නැත. OO වීමට නම් ඔබ දත්ත සඳහා ඉහළ මට්ටමේ අතුරු මුහුණතක් සැපයිය යුතුය.
වින්ස්ටන් එවර්ට්

4
මම හිතන්නේ එය විස්තර කිරීමේ හොඳම ක්‍රමය වනුයේ ඔබේ අතුරුමුහුණත් සැලසුම් කළ යුත්තේ පිටතින් නොව අභ්‍යන්තරයෙන් නොවන බවයි. ඔබේ වස්තුව සපයන අතුරුමුහුණත නියම කළ යුත්තේ වස්තුව භාවිතා කරන ආකාරය අනුව නොව එය ක්‍රියාත්මක කරන ආකාරයෙනි. එබැවින් ලබා ගන්නන් ලියන්න එපා සහ දත්ත අර්ථ නිරූපණය කිරීමට බාහිර වස්තුවට ඉඩ නොදෙන්න. ඔවුන්ට පිළිතුරු සැපයිය යුත්තේ කුමන ප්‍රශ්නයටදැයි සොයා බලා එම ප්‍රශ්නයට පිළිතුරු සපයන ක්‍රමයක් ලියන්න. බාහිර වස්තූන් සැකසුම්කරුවෙකු විසින් තත්වය වෙනස් කිරීමට ඉඩ නොදෙන්න, ඒවා ඉටු කිරීමට අවශ්‍ය කුමන ආකාරයේ හැසිරවීම් සොයා ගැනීමට සහ ඒ සඳහා ක්‍රම ලිවීමට.
වින්ස්ටන් එවර්ට්

2
සමහර අවස්ථාවලදී, Getters සහ Setters හොඳම ක්‍රමයයි. සමහර විට ඒවා ඔබට ලබා දිය හැකි හොඳම අතුරු මුහුණත වේ. කෙසේ වෙතත්, බොහෝ අවස්ථාවල ඒවා එසේ නොවේ. බොහෝ අවස්ථාවන්හීදී, ඔබ ක්‍රියාත්මක කිරීමේ තොරතුරු වෙනත් පංතිවලට කාන්දු කරයි.
වින්ස්ටන් එවර්ට්

-1

පළමුවෙන්ම මා අදහස් කරන වස්තු වර්ග දෙකක් තිබේ, වටිනාකම සහ සේවා වර්ග.

සේවා වර්ගවල කිසි විටෙකත් සැකසුම් නොතිබිය යුතුය, ඔවුන්ට අවශ්‍ය ඕනෑම පරායත්තතාවයක් ලබා ගත නොහැක. පරායත්තතාවයන් පසුකර යාමට හොඳම ක්‍රමය වන්නේ ඉදිකිරීම්කරුවෙකු හෝ කර්මාන්ත ශාලාවක් හරහා වන අතර එමඟින් සියලු අවස්ථා මුල සිටම සරල හා සරල වේ.

අගය වර්ග ද වෙනස් කළ නොහැකි විය යුතුය, මෙය ORM වැනි ප්‍රායෝගික නොවන අවස්ථා හෝ විජට් සිට වස්තුවක් දක්වා වෙනත් සිතියම් ගත කිරීම වැනි අවස්ථා තිබේ. පද්ධතිය වටා එක් ස්ථරයකින් හෝ කොටසකට මාරු වන අනෙකුත් සියලුම වටිනාකම් වෙනස් කළ නොහැකි අතර ඒවා සැකසුම් නොතිබිය යුතුය.


මම තුන්වන වර්ගයක් යෝජනා කරමි: විකෘති කළ හැකි බහාලුමක්, එහි අරමුණ වන්නේ වටිනාකම් එකක් හෝ කිහිපයක් තබා ගැනීමයි; බොහෝ අවස්ථාවන්හීදී, බහාලුමක් තර්කනය හෝ වලංගු කිරීම සඳහා බොහෝ දේ බලාපොරොත්තු නොවිය යුතුය. ධනාත්මක නිඛිල හයක් ගණනය කිරීම සඳහා ක්‍රමයක් අවශ්‍ය වන කේතයට පූර්ණ සංඛ්‍යා හයක් සඳහා බහාලුමක් සම්මත කළ හැකි අතර එමඟින් එහි ප්‍රති results ල ගබඩා වේ. සංඛ්‍යා ධනාත්මක බව සහතික කිරීමේ වගකීම සාමාන්‍යයෙන් පැවතිය යුත්තේ අමතන්නා හෝ කැඳවූ ක්‍රමය මත මිස බහාලුම සමඟ නොවේ.
සුපර් කැට්

-1

වෙනත් ඕනෑම පොදු ක්‍රමයක් යුක්ති සහගත වනවා සේම ගෙටර් / සෙටර් යුක්ති සහගත වේ. සාධාරණීකරණයට ප්‍රධාන වශයෙන් හේතු වී ඇත්තේ අපගේ පන්තිය වෙනත් පංති සමඟ අන්තර්ක්‍රියා කරන ආකාරය නිර්වචනය කරන බාහිර ලෝකයට අතුරු මුහුණතක් සැපයීමට අපට අවශ්‍ය වීමයි. අපි මෙය ප්‍රධාන වශයෙන් කරන්නේ වෙනම ආයතන අතර සම්බන්ධතාවය අඩු කිරීමට අවශ්‍ය නිසාය. සම්බන්ධ කිරීම අඩු කිරීම බොහෝ හේතු නිසා හොඳ දෙයකි:

  • මගේ වර්තමාන කේතයෙන් එකම පන්ති අතුරුමුහුණතක් භාවිතා කළ හැකි අතර ඒ අතරතුර එම පන්තිය නව ක්‍රම එකතු කළ නමුත් (පැරණි අතුරු මුහුණත ආරක්ෂා කර ඇත)
  • පංතියක පාරිභෝගිකයින්ට බලපෑමක් නොකර එහි අභ්‍යන්තර නිරූපණය වෙනස් කළ හැකිය
  • දෝෂ ඇතිවීමේ අවස්ථාව අඩු කරන්න: ඔබ ඔබේ අභ්‍යන්තර දත්ත පුද්ගලික කළහොත් බාහිර කේතය ඔබේ අභ්‍යන්තර දත්ත සමඟ පටලවා නොගන්නා බව ඔබට නිසැකවම දැනගත හැකිය

-1

ඔව්, ලබා ගන්නන් සහ සැකසුම් කරන්නන් වස්තු-නැඹුරු වැඩසටහන්කරණයේ ප්‍රති-රටාවක් වන අතර එය කිසි විටෙකත් භාවිතා නොකළ යුතුය: http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html . කෙටියෙන් කිවහොත්, ඒවා වස්තු-නැඹුරුවන පරමාදර්ශයට නොගැලපේ, මන්ද ඒවා දත්ත ව්‍යුහයක් වැනි වස්තුවකට සැලකීමට ඔවුන් ඔබව දිරිමත් කරන බැවිනි. එය ප්‍රධාන වැරදි වැටහීමකි.


2
පූර්ව පිළිතුරු 18 කින් පැහැදිලි කර ඇති කරුණු වලට වඩා සැලකිය යුතු කිසිවක් මෙය ඉදිරිපත් කරන බවක් නොපෙනේ
gnat

4
කවදාවත් කියන්න එපා ටිකක් ශක්තිමත් .
වින්ස්ටන් එවර්ට්

-4

ඔබේ ක්‍රමලේඛන භාෂා ස්වයංක්‍රීයව ජනනය කරන සමාගම විසින් සංවර්ධනය කරන ලද IDE කිසිවක් “වස්තු දිශානතියේ මූලධර්ම” උල්ලං does නය නොකරනු ඇතැයි මම බලාපොරොත්තු වෙමි.

එසේ පැවසුවහොත්, ඔබට පොදු පරාසයක විචල්‍යයක් ඇති ඕනෑම වේලාවක, ලබා ගන්නෙකු සහ කට්ටලයක් භාවිතා කරන්න, එවිට ඔබ රන්වන් ය. වටපිටාව පිළිබඳ අතිශය වස්තු දිශානත මූලධර්මයේ අත්‍යවශ්‍ය අංගයක් ලෙස මට පෙනේ - එය බොහෝ අවුල් සහගත කේතයක් මෙන් පෙනුනත්.

ඒවා භාවිතා කිරීමට හේතුව, නිසි සංවර්‍ධනය තවමත් සිදුවිය හැකි අතර, ඔබේ වස්තුව සමඟ වඳුරන්ට ඔබේ වස්තුව දැනීමට ඉඩ සලසන ස්තරය ඔබ වියුක්ත කර ඇති තාක් කල්, ඔහු නොදැනුවත්වම එම වස්තුව රැගෙන යා හැකිද?

බෙදුණු නිවසකට නැගී සිටිය නොහැකි බව පැවසීම ප්‍රමාණවත්ය, OO හි කුලී නිවැසියන්ගෙන් එක් අයෙකු තමාටම හැරී නොයන අතර ඔබට වටපිටාව සහ නොමේරූ ප්‍රශස්තිකරණය යන දෙකටම සේවය කළ නොහැක.


4
මම විචල්‍යය සමඟ ගනුදෙනු කරන සෑම අවස්ථාවකම setFoo () සහ getFoo () ඇමතීමට බොහෝ කේත එකතු කිරීමෙන් මම හරියටම ලබාගත්තේ කුමක්ද?
වින්ස්ටන් එවර්ට්

7
මෙන්න කාරණය, මම හිතන්නේ නැහැ ඔබට සංසරණය ලැබේ කියලා. ඔබ තවමත් වෙනත් ස්ථාන වලින් වස්තුවේ තත්වය හසුරුවමින් සිටී. ඔබ එය කරන්නේ වඩාත් වාචිකව ය. සංවර්‍ධනය ලබා ගැනීම සඳහා, එම අගය හිමි පන්තියේ අගයන් හැසිරවීම කේන්ද්‍රගත කළ යුතුය. වෙනත් ඕනෑම දෙයක් OO ඇඳුම්වල කාර්ය පටිපාටික කේතය පමණි. (එහි කිසිඳු වැරැද්දක් අවශ්‍ය නැත, නමුත් එය එයයි).
වින්ස්ටන් එවර්ට්

2
සංවෘත කිරීමේ වාසිය නම්, විශේෂිත අගයන් හා සම්බන්ධ සියලු තර්කනයන් එක තැනක (වැඩි හෝ අඩු) තිබීමයි. මට එය ලබා ගන්නන් සහ කට්ටල සමඟ ලැබෙන්නේ නැත. ඒ නිසා, මම ඔවුන් වෙනුවෙන් විශාල ප්‍රතිලාභයක් ලබා ගනී යැයි මම නොසිතමි.
වින්ස්ටන් එවර්ට්

1
කෙසේ වෙතත්, මම ලබා ගන්නන් සහ සැකසුම්කරුවන් සමඟ කේත ඇති බව මම එකඟ වෙමි, එවිට මහජන ප්‍රවේශය හරහා දත්ත නිදහසේ හසුරුවනු ඇත. එමඟින් මට අවම වශයෙන් පැමිණෙන දත්ත වලංගු කිරීම ඇමිණිය හැකිය.
වින්ස්ටන් එවර්ට්

3
මම නිසැකවම වාචිකත්වයේ රසිකයෙක් නොවේ. නමුත් මගේ විරෝධය ඇත්ත වශයෙන්ම ඔවුන්ගේ විචල්‍යයන් පුද්ගලික කර පසුව ඒවා ලබා ගන්නන් සහ සෙට්කරුවන් අමතන්න. ඔබේ පන්තිය තුළ ගෙටර්ස් / සෙටර් භාවිතා කිරීමට ඔබට අවශ්‍ය නම් එය හොඳයි. ප්‍රශ්නය වන්නේ ඇයි? එහි මා දන්නා මූලික වාසිය නම්, කලින් දෝෂ හඳුනා ගැනීම සඳහා ඔබට දත්ත වල යම් වලංගු භාවයක් කළ හැකි වීමයි. දත්ත හැසිරවීමේ සියලු කේත එකම ස්ථානයක ඇති විට මෙය අඩු උපකාරී වේ. නමුත් එය තවමත් ප්රයෝජනවත් විය හැකිය. ඉතා මැනවින්, ඔබට ගුණාංග වලට සහාය වන භාෂාවක් ඇති අතර වාචිකතාවයෙන් වැළකී සිටිය හැකිය.
වින්ස්ටන් එවර්ට්

-4

මම හිතුවේ අපිට මීට වඩා සුපුරුදු පිළිතුරු ලැබෙනු ඇතැයි කියාද?

ලබා ගන්නන් සහ සැකසුම් කරන්නන් සාමාන්‍යයෙන් අතිශයින්ම ඕඕපී ය (වෙනත් ඕනෑම දෙයක් වැරදියි, එය සරල ය).

ඉංජිනේරුවෙකු ඉක්මවා නොයෑමට ඔබට මතක තබා ගත යුතු වුවද, කිසි විටෙකත් අවශ්‍ය නොවන යන්ත්‍රයක් හෝ කට්ටලයක් සාදන්න. ඔබ වෙනත් පංතියක් විසින් භාවිතා කිරීමට නොයන ඕනෑම තොරතුරක් ඔබට ලබා ගන්නෙකු හෝ සැකසුම්කරුවෙකු නොතිබිය යුතුය.

කෙසේ වෙතත්, ඔබ ක්ෂේත්‍ර ප්‍රසිද්ධ නොකිරීමට හේතුව සහ ඒ වෙනුවට ලබා ගන්නන් සහ සැකසුම් කරුවන් වීමට හේතුව:

  • ක්ෂේත්ර භාවිතා කිරීමෙන් නිසි පරීක්ෂණ සිදු කළ නොහැක. ඒ සම්බන්ධයෙන් ලබා ගන්නන් / සැකසුම් කරන්නන් වඩා හොඳය.

  • තථ්‍ය කාලීන ක්‍රමලේඛන සැකසුමක ක්ෂේත්‍ර නිසි ලෙස භාවිතා කළ නොහැක. සමමුහුර්ත කරුවන් / කට්ටල යනු යා යුතු මාර්ගයයි.

  • අතුරුමුහුණත් මාතෘකාව (දැනටමත් පැහැදිලි කර ඇති බැවින් මම එසේ නොකරමි).

  • පද්ධතිය නිසි ලෙස නැවත භාවිතා කිරීමේදී භාවිතා කිරීම පහසුය.

  • ඔබේ පංතිය භාවිතා කරන්නේ කුමන පන්තිද යන්න සහ ඔබ ලබා ගන්නෙකුට / සැකසීමට වඩා ක්ෂේත්‍රයක් වෙනස් කළහොත් කුමක් බිඳී යනු ඇත්දැයි දැන ගැනීම වඩා දුෂ්කර ය.

ඒ නිසා ඔබ නිල ව්‍යාපෘතියක් නොකරන විට විනෝදය සඳහා එය කරන අතර එය ලබා ගන්නා තැනැත්තා / සැකසුම් කරුවන් සමඟ කරදර විය නොහැක.


2
පරීක්ෂණ හැකියාව සඳහා +1. කිසිවෙකු එය කලින් සඳහන් නොකිරීම කම්පනයකි. දේපලවල තවත් ප්‍රයෝජනවත් අංගයක් වන්නේ ඒවා නිදොස්කරණය කිරීමයි. (ක්ෂේත්‍ර සඳහා දෘඩාංග / මතක කඩඉම් ලකුණු අවශ්‍ය වනවාට වඩා කේතයේ බ්‍රේක්පොයින්ට් එකක් ඇතුළත් කිරීම පහසුය).
මාර්ක් එච්

9
ලබා ගන්නන්ට සහ සැකසීමට ඇති විරෝධය නම්, ඔවුන් බොහෝ විට OOP නීතියේ ලිපිය අනුගමනය කිරීමට භාවිතා කරන අතර ආත්මය සහ අභිප්‍රාය නොසලකා හැරීමයි. OOP පවසන්නේ ඔබ වෙනත් වස්තූන් ඔබේ අභ්‍යන්තරය සමඟ සම්බන්ධ වීමට ඉඩ නොදිය යුතු බවයි. ඔබට එය කෙසේ හෝ කිරීමට ඉඩ දෙන ගෙටර්ස් සහ සෙටර්ස් අර්ථ දක්වන්නේ නම්, ඔබ අවසන් වන්නේ ඕඕපී උල්ලං ting නය කිරීමෙනි.
වින්ස්ටන් එවර්ට්

6
සරල පොදු ක්‍ෂේත්‍රවලට වඩා ලබා ගන්නන්ගේ සහ සැකසීමේ ප්‍රතිලාභ බොහෝමයක් ඇති බව මම එකඟ වෙමි. කෙසේ වෙතත්, ඔවුන් සමඟ පරීක්ෂණ වඩා හොඳ වන්නේ කෙසේදැයි මට පැහැදිලි නැත. ඔබට පැහැදිලි කළ හැකිද?
වින්ස්ටන් එවර්ට්

4
KSkarion: මම ඔබේ පිළිතුරට එකඟ නැහැ. ඔබ විකල්ප දෙකක් ඉදිරිපත් කරන බව පෙනේ: එක්කෝ ගෙටර්ස් / සෙටර් භාවිතා කිරීම හෝ ක්ෂේත්‍ර ප්‍රසිද්ධ කිරීම. නමුත් තුන්වන විකල්පයක් ඇත: ලබා ගන්නන් / සැකසුම් භාවිතා කිරීම හෝ ක්ෂේත්‍ර නිරාවරණය කිරීම! අභ්‍යන්තර ක්ෂේත්‍රයක තත්වය පරීක්ෂා කිරීමට ඔබට අවශ්‍ය ඇයි? ඔබ ඔබේ වස්තුවේ පොදු API පරීක්‍ෂා කළ යුතු නොවේද?
ඇන්ඩ්‍රස් එෆ්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.