Вызов метода формы Windows без активного экземпляра формы - PullRequest
0 голосов
/ 28 апреля 2009

Я разрабатываю приложение для Windows на C # с использованием VS2005. Предположим, мне нужно вызвать нестатический метод (Method1), который находится в классе (Class1) из другого класса (Class2). Чтобы вызвать метод, мне нужно создать объект для этого класса.

Но мой класс 'Class1' содержит более 1000 переменных. Поэтому каждый раз, когда я создаю объект для «Class1», создаются все переменные, но мой метод «Method1» использует очень мало из этих переменных. Так что излишне все остальные переменные становятся экземплярами.

Как я могу оптимизировать этот код, так как это накладные расходы на создание переменных, которые не нужны для конкретного метода, который должен быть вызван.

Или есть какой-то другой стандарт кодирования, с помощью которого я могу преодолеть это? Заранее спасибо.

вот список моих переменных. Редактирование:

       private string m_sPath = String.Empty;
        private string m_sModule = String.Empty;
        private string m_sType = String.Empty;

        public static string strFileSave;
        private string fileName = "", strFactoryXML = "", strPriorityXml = "", strTempXml = "";
        private string selMethod = "";
        private string selClass = "";
        private string selMethodName = "";
        private string str, str1, str2;
        public static string strFolder;
        public static string strFilePath = "";
        public static string sel1, sel2;
        private string strSetPrFileName = "";
        private string results;
        private string strClassCompare, strMethodCompare, strTestResultCompare;
        public static string CurrWorkingDirectory = Environment.CurrentDirectory;
        private System.Threading.ThreadStart m_CummulativeTimeThreadStart = null;
        private System.Threading.Thread m_CummulativeTimeThread;
        private string[] OuterDelim = null;
        private string[] InnerDelim = null;
        public static ArrayList alObjectsNotDefined;
        public static ArrayList alSystemObjUnDefined = null;
        public static string objFileName = "";
        public static string XmlFileName = "";
        //Integers
        private int nMethodCount, index = 0;
        private static int nClearFlag, nExp = 0, cell;
        public static int flag;
        private static int nMemberCount, nPrevMemberCount;
        private static int classIndex, methodIndex;
        private static int[,] arrIndex = new int[100, 100];
        private int indexThread;
        private int bFlag = 0;
        //private int nIndexClass=0,nIndexMethod=0;
        frmCreateProject cp = new frmCreateProject();


        //Boolean
        private bool crFlag = false, tvAfter = true;
        private bool bSetPriority = false;
        private bool bFilter = false;

        private bool bCr = false;
        private bool snapShotFlag = false, factoryFlag = false, tvSel = false;
        private bool bResultsFlag = false, bSummaryFlag = false;
        public static bool bClick = true, rightMouse = false;
        private bool dataError = false;
        private bool bClassFilter = false, bMethodFilter = false;//,bTestResultFilter=false;
        private bool tvFact = false;
        //private bool bAssignFactory=false;
        //private bool factoryChanges=false;
        private bool bEntered = false;
        public static bool bAssign = false;
        private bool bChangeMethFactory = false;
        private bool bExecution = false;

                public bool bModule = false;
        public bool bClass = false;
        public bool bMethod = false;

        public bool bAssemLoaded = false;         public bool bLoadClicked = false;         public static bool bAssignCustom = false;
        public static string strPath;
        //  public static  int intRowCount;
        public bool bTestGen = false;
        //Others
        private Module[] mdls = null;
        private Assembly oAssembly;
        private DataTable dtSnapshot;
        private DataTable dtFactory;
        private DataTable dtFactoryGV        private DataTable dtExceptions = new DataTable();
        private DataTable dtResults = new DataTable();
        private DataTable dtSummary = new DataTable();
        private DataRow dr;
        private DataRow drGV;
        private DataColumn dc, dc1;
        private DataColumn dcGV;
        private Type m_Type;
        private Type[] types = new Type[100];
        private XmlDocument doc = new XmlDocument();
        //private XmlDocument docTemp=new XmlDocument();
        private DataGridTextBoxColumn TextCol;
        private DataGridTextBoxColumn TextColGV;
        private object[] arguments = new object[20];
        public static bool bSupport = false;
        DataGridTableStyle ts1 = null;
        DataGridTableStyle ts2 = null        DateTime gridMouseDownTime;
        XmlElement gridElement = null;
        XmlNodeList gridList = null, gridCustom = null;

        public string testAssem;




        public string strXmlTestCase;
        public string Gen_dll_path;
        public static string curClass = "";

        public static string curMethod = "";
        public static string curTestResult = "";

        public static bool comdll = false;

        public static bool bIncludeNullValue;
        public static string strMainExcep;

        public static string cmbFactoryClassSel = "";
        public static string cmbFactoryMethodSel = "";
        public static string dataGridParameter = "";
        private static string strReferredTable = "";


        public static string strExePath = ""; 
        public static string strProjPath = "";
        public static string strFactoryType = "";
        public static string strParameterName = "", strParameterType = "";
        public static string checkFactoryClass = "";
        public static string strFileXml = "";
        public static bool bEdit = false;
        public static bool bNumArr = false;
        public string checkType = "";
        public static bool bThread = true;
        public static bool bObjectsDefined = false;
        public static bool bSystemObjDefined = false;
        public static string cmbFactoryNewMethodSel = "";

        public static bool editAuto = false;
        private System.Windows.Forms.MainMenu mainMenu1;
        private System.Windows.Forms.MenuItem mnuFile;
        public System.Windows.Forms.MenuItem mnuTest;        private System.Windows.Forms.MenuItem mnuExit;
        private System.Windows.Forms.MenuItem mnuHelp;
        private System.Windows.Forms.MenuItem mnuAbout;
        public System.Windows.Forms.ToolBar toolBar1;        private System.Windows.Forms.TabControl tcResults;
        private System.Windows.Forms.TabPage tpSummary;
        private System.Windows.Forms.TabPage tpExceptions;
        private System.Windows.Forms.DataGrid dataGridSummary;
        private System.Windows.Forms.RichTextBox rtbOutput;
        private System.Windows.Forms.DataGrid dataGridExceptions;
        private System.Windows.Forms.Splitter splitterDown;
        private System.Windows.Forms.Splitter splitterTV;
        private System.Windows.Forms.OpenFileDialog openFileDialog1;
        private System.Windows.Forms.ImageList imageList1;
        private System.Windows.Forms.ToolBarButton toolBarOpen;
        private System.Windows.Forms.ToolBarButton toolBarTest;
        private System.Windows.Forms.Panel panelResults;
        private System.Windows.Forms.TabPage tpProblems;
        private System.Windows.Forms.RichTextBox rtbProblems;
        private System.Windows.Forms.MenuItem mnuCreateProject;
        private System.Windows.Forms.MenuItem mnuOpenProject;
        private System.Windows.Forms.ToolBarButton toolBarNew;
        private System.Windows.Forms.PictureBox pictureBox1;
        protected System.Windows.Forms.ContextMenu contextMenuTest;
        private System.Windows.Forms.ToolTip toolTip1;
        private System.Windows.Forms.MenuItem mnuAssignFactory;
        private System.Windows.Forms.ContextMenu contextMenuFactory;
        private System.Windows.Forms.MenuItem mnuViewAutoFactory;
        private System.Windows.Forms.ContextMenu contextMenu1;
        private System.Windows.Forms.MenuItem mnuEditCustomFactory;
        private System.Windows.Forms.MenuItem mnuDeleteCustomFactory;
        private System.Windows.Forms.ToolBarButton toolBarPriority;
        private System.Windows.Forms.MenuItem mnuSetPriority;
        private System.Windows.Forms.ContextMenu contextMenuResults;
        private System.Windows.Forms.MenuItem mnuPerformance;
        private System.ComponentModel.IContainer components;


        public static System.Windows.Forms.TreeView tempTV        public static string classNameGV;
        public string strAppPath = "";
        public string strTempPath = "";
        public bool bDllExists;
        public string smTemp1 = "";
        public string strTestFolder = "";
        public static bool bReloadNewDll = false;
        private string dllUnderTest = "";
        private System.Threading.ThreadStart m_UpdateDBTimeThreadStart = null;
        private System.Threading.Thread m_UpdateDBTimeThread;
        private TabPage tabPage2;
        private TreeView tvTestAssemb;
        private TabPage tabPage1;
        private TreeView tv;
        private TabControl tabControl1;
        public static string Output;
        private MenuItem menuItem3;
        private MenuItem menuItem4;
        private MenuItem menuItem5;
        private MenuItem menuItem1;
        private MenuItem menuItem2;
        private TabPage tpTestGen;
        public StatusBar statusBar1;
        private TextBox txtTestGen;
        private TabPage tpTestCaseTable;
        private DataGrid dataGrid2;
        private Panel panel1;
        private Button btnGenerate;
        private Button btnSave;
        private Button btnTestCase;
        private Label label5;
        private ComboBox cmbTestCase;
        private DataGrid dataGrid1;
        private TabPage tpGlobalVariable;
        public DataGrid dataGridFactoryGV;
        private Panel panelGlobalVariable;
        private ComboBox cmbMethodNameGV;
        private Label label2;
        private Label label1;
        private ComboBox cmbClassNameGV;
        private TabPage tpFactorySettings;
        private Panel panelFactory;
        public DataGrid dataGridFactory;
        private Panel panelClassDetails;
        private Label lblClassName;
        private ComboBox cmbClassName;
        private Label lblMethodName;
        private ComboBox cmbMethodName;
        private TabPage tpSnapshot;
        private Panel panelUpdateMsg;
        private PictureBox pictureBox2;
        private Label label4;
        private DataGrid datagridSnapshot;
        public TabControl tcSnapshot;
        public StatusBar statBar;


        public ArrayList alMultiLevelTableName = new ArrayList();

        public ArrayList alExpRes;        
public ArrayList alParVal; 
        public ArrayList alTestCaseID        
public ArrayList alClassName;
        private MenuItem menuItem6        
public ArrayList alMethSig;
        public ArrayList alComments; 

Ответы [ 11 ]

7 голосов
/ 28 апреля 2009

Трудно сказать, что можно сделать, чтобы решить эту конкретную проблему. Однако можно сказать, что наличие такого огромного класса - определенно кодовый запах . Попробуйте реорганизовать ваши классы, чтобы класс, необходимый для работы метода в Class2, имел более «нормальный» размер.

РЕДАКТИРОВАТЬ Святая корова! Вы явно пытаетесь вызвать метод для класса Form. Переместить требуемую логику в третий класс.

2 голосов
/ 28 апреля 2009

Очень хорошо для хорошо спроектированного класса потребуется 1000+ переменных. Похоже, что с дизайном Class1 что-то не так. Если вам нужно вызвать этот нестатический метод, то вам нужно создать экземпляр класса, и это никак не повлияет на производительность. Поэтому, если вы можете, вам нужно провести рефакторинг.

Вы могли бы:

  • Разделите Class1 на более мелкие классы, которые гораздо больше сосредоточены на одной работе.
  • Вы можете выполнить рефакторинг метода, который вам нужно вызвать, чтобы он не требовал создания экземпляра класса (возможно, так как он не использует много данных класса).

Удачи.

1 голос
/ 28 апреля 2009

Давайте на секунду предположим, что ваши классы объектов хорошо спроектированы и обязательно велики и придерживаются поставленной задачи. Если вы создаете экземпляр Class1 для вызова одного метода и только одного метода, возможно, логика принадлежит другому.

Меняет ли метод члены класса Class1? Вы читаете свойства Class1, чтобы получить вывод? Как только вы получите результат, будет ли создан экземпляр Class1?

Если ответы на эти вопросы положительные, этот метод может вообще не относиться к классу 1. Попробуйте изменить метод так, чтобы в логике использовались только переданные параметры, а возвращаемое значение было единственным выходным.

1 голос
/ 28 апреля 2009

Всем действительно приятно, когда говорят, что 1000 переменных в одном классе - это запах кода и намек на разделение класса. Честно говоря, это гораздо хуже, чем это.

1000 переменных в одном классе неопределяемы.

1 голос
/ 28 апреля 2009

Похоже, вам нужно немного переосмыслить свою реализацию. Если у вас есть класс с 1000 переменными, в котором любой данный экземпляр использует только часть этих переменных, вам будет гораздо лучше работать с использованием некоторого пакета свойств.

public class C1 {
  private Dictionary<string,object> m_bag = new Dictionary<string,object>();
  public string Name {
    get { return (string)m_bag["Name"]; }
    set { m_bag["Name"] = value; }
  }
  ...
}

В противном случае вам придется объявить поле для каждой вашей переменной. Если вы используете только несколько таких полей для каждого объекта, у вас будет невероятное количество отходов в вашей программе. Этот образец является расточительным, потому что он использует резервное хранилище, но он почти наверняка менее затратный, чем использование небольшого количества полей в классе полей 1000.

0 голосов
/ 28 апреля 2009

Один из способов начать разделение этого класса - посмотреть, какие поля используются в каких методах.

Как вы описали выше, вы быстро увидите, что не все методы используют все поля в классе. Это признак того, что вашему классу не хватает внутренней сплоченности. То, что вы хотите сделать, это преобразовать этот класс в несколько классов, которые являются более связными внутри.

Итак, ищите группы функций, которые работают в одних и тех же полях. Эти кластеры - более мелкие классы, которые хотят вырваться из класса Uber, который вы здесь имеете. Когда вы перемещаете эти кластеры методов и поля, которые они используют, в свои отдельные классы, ищите выразительные имена для концепции, которую представляет кластер.

Многие из полученных классов будут полезны сами по себе (и могут быть протестированы самостоятельно). Оставшийся исходный класс может в конечном итоге использовать многие из этих вновь созданных классов для выполнения функций, которые он предоставляет.

Обратите внимание, что это не полностью механический процесс, а скорее эвристический, который может дать вам хорошее начало для устранения этого беспорядка.

0 голосов
/ 28 апреля 2009

У меня есть 452 статических поля только для чтения для всей моей системы IronScheme. Затем еще 2000 нечетных других статических полей (для штучных символов и глобальных ссылок).

Для загрузки по-прежнему требуется всего 100 мс.

0 голосов
/ 28 апреля 2009

Я бы рекомендовал прочитать больше о Принципе единой ответственности (SRP).

0 голосов
/ 28 апреля 2009

Class1 имеет более 1000 переменных? Уже одно это намекает на то, что у вас есть проблемы с дизайном класса. Также, если вам часто требуется экземпляр класса, который использует только часть класса, вы наверняка сможете разбить класс на более мелкие части.

В чем идея Class1? Чего он пытается достичь?

0 голосов
/ 28 апреля 2009

Я бы предложил разделить ваш класс,> 1000 переменных в одном классе могут быть запахом кода, который класс делает слишком много?

Если вы разделите переменные, необходимые для Method1, на отдельный класс, это может упростить жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...