الحقل TcpClient من الفئة الأساسية مجردة باستمرار التخلص

StackOverflow https://stackoverflow.com/questions/204037

  •  03-07-2019
  •  | 
  •  

سؤال

ولدي فئة قاعدة مجردة مع حقل TcpClient:

public abstract class ControllerBase
{
    internal protected TcpClient tcpClient;

ولديه طريقة لإعداد اتصال:

private void setupConnection(IPAddress EthernetAddress, ushort TcpPort)
    {
        if (this.tcpClient == null || !this.tcpClient.Connected)
        {
            this.tcpClient = new TcpClient();

            try
            {
                this.tcpClient.Connect(EthernetAddress, TcpPort);
            }
            catch(Exception ex)
            {
                throw new TimeoutException("The device did not respond.\n" + ex.Message);
            }
        }
    }

ومن الطرق لطلب البيانات:

 internal protected virtual byte[] requestData(IPAddress EthernetAddress, ushort TcpPort, byte[] data, bool IgnoreResponse)
    {
        setupConnection(EthernetAddress, TcpPort);

        //The rest of the code uses this.tcpClient 

وهناك عدد قليل من الآخرين، مثل requestRawData، الخ ... كانت مطلوبة من أجل بروتوكولات الاتصال أجهزة محددة للغاية، ولكن هذا ليس جزءا من هذا السؤال بأي شكل من الأشكال.

وأنا بعد ذلك الفئات التي تجنيها من هذه الفئة، والتي تجاوز أساليب الفئة الأساسية:

public class Controller : ControllerBase
{
  internal virtual byte[] requestData(byte[] data, bool IgnoreResponse)
  {
        return base.requestData(this.eth0.EthernetAddress, this.eth0.TcpPort, data, IgnoreResponse);
  }

ورمز يعمل بدون أي استثناءات، ولكن في كل مرة يتم استدعاء أسلوب setupConnection، يبدو أن المثال TcpClient (tcpClient) ليتم التخلص منها، لذلك يتم إنشاء واحدة جديدة ويسمى أسلوب الاتصال مرة أخرى، وتباطؤ حقا إلى أسفل عملية الاتصال.

ملحوظة: طرق العامة للدعوة الطبقة الطفل طريقة requestData، التلخيص تفاصيل كثيرة من المطور باستخدام هذه المكتبة.

ومثل SetDevicePower (البايت PowerLevel)، QueryDeviceName () الخ ...

ورمز مثل هذا:

Controller controller = new Controller("172.17.0.3",34000);
string name = controller.QueryDeviceName();
controller.SetDevicePower(200);

ويتسبب في طريقة ربط ليتم استدعاؤها مرتين ... لماذا هو يتم التخلص منها بين المكالمات؟

هل كانت مفيدة؟

المحلول

وهناك بعض أوجه القصور في الأسلوب "setupConnection" التي قد ترغب في النظر في. الشاغل الأول هو أنك instantiating في TcpClient عندما انها مغلقة. هذا ليس ضروري. وأود أن تقسيم الاختيار لاغيا وربط المنطق في 2 طرق، أو اثنين على الأقل من كتل التعليمات البرمجية في الأسلوب:

  if (this.tcpClient == null)
  {
    this.tcpClient = new TcpClient();
  }

  try
  {
    if (!this.tcpClient.Connected)
    {
      this.tcpClient.Connect(EthernetAddress, TcpPort);
    }
  }
  catch(Exception ex)
  {
    throw new TimeoutException("The device did not respond.\n" + ex.Message);
  }

وثانيا، والصيد (استثناء) هو أيضا فكرة سيئة، لا يمكن أن نفترض الاستثناء مهلة، كما أن هناك العديد من الاستثناءات الأخرى التي يجب أن تكون اشتعلت هنا.

وأما بالنسبة لإجابتك: قد تضطر إلى تقديم مزيد من التفاصيل التنفيذ ضمن طريقة requestData الخاص بك، كما يمكن أن يكون هناك فكرة في هناك. على سبيل المثال، هل إغلاق الاتصال؟ إذا كان الأمر كذلك، وكنت في نهاية المطاف خلق كائن TcpClient جديد على المكالمة التالية إلى setupConnection، والتي قد يكون ما يحدث هنا.

وهذا الأمل يلقي بعض الضوء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top