किसी पोर्ट में मुहावरों का उपयोग करके एपीआई बनाए रखें


12

मैं पायथन से रस्ट तक के पोर्ट पर काम कर रहा हूं और कुछ कोड में भाग गया हूं जो स्वाभाविक रूप से रस्ट में व्यक्त नहीं किए जा सकते हैं क्योंकि वे पायथन में हो सकते हैं।

इसका एक मामला डिफ़ॉल्ट मापदंडों का उपयोग कर रहा है:

class Foo:
  def __init__(self, a="Hello"):
    self._a = a

जंग में, आप एक बिल्डर का उपयोग करके इसे लागू कर सकते हैं:

struct FooBuilder {
  a: &'static str,
}

struct Foo {
  _a: &'static str
}

impl FooBuilder {
  fn new() -> FooBuilder {
    FooBuilder {
      a: "Hello",
    }
  }

  fn change_a(self, new_a: &'static str) -> FooBuilder {
    FooBuilder {
      a: new_a,
      ..self
    }
  }

  fn build(self) -> Foo {
    Foo {
      _a: self.a,
    }
  }
}

पायथन में कक्षा का उपयोग करने के लिए, यह बस है:

foo = Foo("Hello, World!")

हालाँकि, Rust में, आपको कुछ लिखने की आवश्यकता होगी:

let foo = FooBuilder::new().change_a("Hello, World!").build();

यह प्रश्न की ओर जाता है: क्या पोर्ट के लिए एपीआई बनाए रखना बेहतर है, या पोर्टिंग भाषा के मुहावरों का उपयोग करना बेहतर है? क्या यह इस बात पर निर्भर करता है कि एपीआई को कितनी अच्छी तरह से जाना जाता है?


2
एक वर्ग का एपीआई यह है कि आप इसका उपयोग कैसे करते हैं, न कि यह कि इसे कोड में कैसे व्यक्त किया जाता है। तो, उस अनुवाद में एक अलग और बस अस्वीकार्य रूप से बोझिल ABI है।
डिडुप्लिकेटर

यह कहाँ कहा गया है कि यह मुहावरेदार जंग है?
नादिर संपोली

मुझे खेद है, मुझे गलत समझ लेना चाहिए था। आपने दुविधा के साथ कुछ रस्ट कोड पोस्ट किए हैं: मौसम आप एक बंदरगाह के लिए एक एपीआई बनाए रखेंगे या आप पोर्टिंग भाषा के मुहावरों का उपयोग करेंगे । यह कोड उन मामलों में से एक की तरह नहीं दिखता है। यदि यह सही व्याख्या है, तो उस कोड नमूने का उद्देश्य क्या है? इसका वर्णन क्या है और यह वास्तविक प्रश्न से कैसे संबंधित है?
नादिर संपोली

जवाबों:


18

आप अपने विचारों को उस भाषा में स्पष्ट रूप से व्यक्त करना चाहते हैं जो उन्हें होस्ट करती है। इसका मतलब है कि मेजबान भाषा के मुहावरों का उपयोग करना।

लोकप्रिय अंडरस्कोर लाइब्रेरी लें: js और lua । लुआ पोर्ट कार्यात्मक रूप से अधिकांश भाग के बराबर है । लेकिन जब यह उपयुक्त होता है, तो कार्यान्वयन थोड़ा अलग होता है। उदाहरण के लिए:

_.toArray()

हो जाता है

_.to_array()

यह परिवर्तन फ़ंक्शन नाम को Lua प्रोग्रामर के लिए अधिक मूल महसूस करता है

इसी तरह, _.each () के लिए जावास्क्रिप्ट में किसी ऑब्जेक्ट, एरे, या कुछ ऐरे-की तरह की आवश्यकता होती है, लेकिन लुआ में _.each () भी एक पुनरावृत्ति ले सकता है - एक तंत्र जो जावास्क्रिप्ट में उपलब्ध नहीं था जब मूल अंडरस्कोर लाइब्रेरी बनाया गया था।

लुआ लेखक ने समझदारी से अनुवाद किया कि मूल लेखक ने क्या इरादा किया होगा यदि उन्होंने इसे लुआ में लिखा था। यही कुंजी है। मूल इरादे के बारे में खुद से पूछें और फिर अपनी पसंद की भाषा - मुहावरों और सभी में उस इरादे को लागू करें। स्रोत और लक्ष्य भाषा के आधार पर, इसका अर्थ सुविधाओं को जोड़ना, संपादित करना या निकालना हो सकता है।

याद रखें कि क्रॉस-भाषा उपयोगकर्ता दुर्लभ होंगे। अधिकांश उपयोगकर्ता एक भाषा या दूसरे का उपयोग करेंगे। उनके लिए, मतभेद मायने नहीं रखते। यदि कोई व्यक्ति दोनों का उपयोग करता है, तो वे संभवतः आपके अनुवाद की सराहना करने के लिए पर्याप्त परिष्कृत हैं। यह बोली जाने वाली भाषाओं के अनुवाद से अलग नहीं है। कुछ विचार सीधे अनुवाद योग्य नहीं हैं। सर्वश्रेष्ठ अनुवादक मूल के इरादे से चिपके रहते हैं, न कि शब्द-दर-शब्द शाब्दिक अनुवाद।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.