2010-08-06 4 views
4

이전 게시글에서 언급했듯이, 저는 현재 C#을 배우고 있으며, 실제 프로젝트를 처음 작성한 경우 (안녕하세요 세계와 일부 혼란 스러우면 두 번째 임) 실제 EPOS 시스템을 만든 다음 확장 해 보겠습니다. ..공용 정적 변수 C# 올바르게 사용 되었습니까?

내 의도는 모든 가격, 출납원 세부 정보, 판매 거래 등을 MySQL 데이터베이스에 저장하는 것입니다. (PHP에서 C#으로 이동할 수는 있지만 MySQL에서 멀리 떨어지게 할 수는 없습니다!)

내가 현재 (2 개 형태가

:)

는 내가 확인하고 싶은 것은 다음과 같다 0

  • 로그인 화면 (사용자가 PIN 번호를 입력하는 곳)
  • 주요 판매 화면.

사용자가 로그인하면 내 데이터베이스에 저장된 세부 사항에 대해 인증하고 성공하면 주요 판매 화면을로드합니다.

어떻게 든 양식 사이에서 정보를 전송해야합니다. 그래서 내가 수행 한 작업은 여기에 variableStore.cs이라는 새 클래스 파일을 만들고, userID, userName을 저장할 것입니다. (따라서 "현재 로그인되어 있습니다 : 신원 미상 "각 양식의 상태 표시 줄에.

그러나 나는 또한 전송에 동일한 파일을 사용하는 것입니다

"주위의 형태 사이 등등, 트랜잭션 전체를 ".

하는이, 확인 (올바른 올바르지 않습니다, 그러나 당신이 그것을 어떻게 할 것인가?) 일을하는 방법

+0

, 귀하의 질문은 정말 약간 (C#을 학습하는 과정에서 아직)이 혼란 스러워요 – Richard

답변

1

아니, 그건 내가 어떻게 처리 할 것인가가 아니다 .

더 나은 처리 방법은 생성자, 속성 또는 메서드를 통해 양식간에 값을 전달하는 것입니다.

이제 생성자

public class SalesForm : Form 
{ 
    public SalesForm(string userName) 
    { 
     Text = "Currently Logged In: " + userName; 
    } 
} 

, 로그인 폼 버튼을 클릭 핸들러 (사용자 인증 후) :

var mainForm = new SalesForm(userName); 
mainForm.Show(); 

재산권

public class SalesForm : Form 
{ 
    private string _userName = null; 

    public string UserName 
    { 
     get 
     { 
      return _userName; 
     } 
     set 
     { 
      _userName = value; 
      if(!String.IsNullOrEmpty(_userName)) 
       Text = "Currently Logged In: " + _userName; 
     } 
    } 
} 

그리고 다시, ~에

var mainForm = new SalesForm(); 
mainForm.UserName = userName; 
mainForm.Show(); 

방법

public class SalesForm : Form 
{ 
    public void SetTitle(string userName) 
    { 
     Text = "Currently Logged In: " + userName; 
    } 
} 

: 그리고 그는 양식 버튼을 클릭 핸들러 로그인

var mainForm = new SalesForm(); 
mainForm.SetTitle(userName); 
mainForm.Show(); 
+0

안녕 저스틴, (이전에 적어도 링크 수없는 경우) 수 독립 할 필요가 당신은 어떻게 작동하는지에 대한 좀 더 자세한 설명을 해줄 것입니다. 문제가 발생하면 죄송합니다. Tom Kirby. –

0

일반적으로하지만, 작고 사소한 경우에 따라 IServiceProvider 패턴을 사용하는 것이 바람직하다, static은 괜찮습니다.

1

나는 이렇게 말하지 않을 것입니다. 이 웹 응용 프로그램입니까?

사용자 정보와 비즈니스 계층 정보는 별도로 보관해야합니다. 그러면 필요한 경우 나중에 사용자 정보를 변경할 수 있습니다.

거래 합계를 넘기 위해서는 데이터베이스의 정보를 쿼리하여 웹 페이지에 표시해야합니다. 이럴 수있어?

또한 다음을 사용하여 데이터를 전달할 수 있습니다 : -

1. constructor 
2. objects 
3. properties 
4. Delegates 
+0

나도 동의한다 ... 단지 생성자를 호출하는 것은 사람의 이름의 문자열에 "판매"를 완료하기 위해 거래/라인 항목 등의 그룹을 직접 연관시키는 "배경"이 없다. LoggedInUser의 "클래스"객체에는 이름, 설명, 장바구니 합계 등을 가져올 속성이 있지만 내부 ID와 같은 숨겨진 요소가 있습니다. – DRapp

1

인증 및 권한 부여에 대해 얘기, 그런 다음 스레드 (Thread.CurrentThread) 내에서 설정 IPrincipal 및 IIdentity, 당신 자신의 구현을 작성해야합니다.

IPrincipal은 스레드를 진행하며 사용자의 IIdentity를 유지합니다. 구현이 쿼리되어 사용자가 인증되었는지 여부와 사용자가 수행 할 수있는 작업을 확인할 수 있습니다 (IsInRole 참조).

정보를 저장하기 위해 전역 변수를 사용하는 것은 좋은 생각이 아닙니다. 그러나, 당신은 밖으로 시작하고, 그래서 그것은 당신을 위해 좋을지도 모른다.

양식을 설정 한 곳에서 공용 속성을 만들고 양식을 닫은 후 양식에서 사용자 작업 결과를 얻을 수도 있습니다 (양식은 다른 것과 마찬가지로 개체입니다) . 폼 B가 닫힌 후 폼 A가 폼 B를 인스턴스화한다면, B의 모달을 보여주고, 다시 제어 도착 후

public class B : Form 
{ 
    // Set when the user completes a sale and closes the form with the OK button. 
    public SaleItem Sale{ get; private set;} 
} 

B.

의 속성에서 사용자 상호 작용 (그들이 무엇이든) 결과를 얻을 수있는 형태 A를 이것은 변수에 전역 저장소를 사용하는 것보다 훨씬 낫습니다. 이 작업을 수행하는 경우 Unity와 같은 종속성 주입 프레임 워크를 사용하여 응용 프로그램 내에서 판매와 같은 기능을 제공하는 클래스의 인스턴스를 가져옵니다.

0

시작하기에 앞서 작고 간단한 응용 프로그램의 경우 정적 변수를 사용하면 실행하는 데 도움이 될 수 있지만 원하는 습관은 아닙니다. 모든 상태 변수를 한 곳에서 적어 두었다가 다시 사용하지 않고 실제로 사용하는 위치를 생각해보십시오. 변수 중 일부가 프로그램의 작은 부분에서만 사용되는 경우 프로그램의 해당 부분에만 인스턴스가 주어진 클래스에 넣는 등 프로그램의 나머지 부분에서 변수를 숨기는 방법을 생각해보십시오 의. 당신이 당신의 프로그램을 작성할 때, 주기적으로 휴식을 취하는, 수업을보고 다음에 대해 생각 :

  1. 캡슐화 : 내 수업은 잘 정의 된 일을하고 있거나 다른 모든 일을하려고? 수업의 직업 설명이 무엇인지 즉시 알 수 없다면 너무 많이 할 것입니다. 기능을 개별적으로 작업 할 수있는 작은 조각으로 나누는 것을 고려하십시오.

  2. 절연 : 내 수업에서 다른 클래스가 알아야 할 정보가 노출되어 있습니까? 나는 그들이 다른 직업을 위해 나를 사용하기 위해 그들이 필요로하는 것을 다른 교실에만 알려야한다. 또한 가능한 한 최선을 다해 다른 수업이 내 직업을 방해하지 못하도록해야합니다. 다른 클래스가 나를 잘못 사용하면, 개발자가 뭔가 잘못되었다는 것을 알기 위해 큰 소리로 (예외를 던지십시오) 불평해야합니다.

  3. 비 반복 : 두 코드 사이에 약간의 수정 만 가하여 매우 유사한 코드 조각이 있습니까? 이러한 코드를 단일 메서드로 통합하고 각 메서드에서 해당 메서드를 호출하는 방법을 찾아보십시오.버그를 수정하고 코드의 여러 위치로 이동하여 수정 사항을 적용해야하는 경우 이는 반복되는 기호입니다. 이 문제를 해결할 시간을 투자하면 미래에 많은 방법으로 도움이 될 것입니다.

이러한 원칙은 모든 당신이 당신의 코드를 이해하는 데 도움으로 코드의 부분 사이의 가능한 상호 작용의 수를 최소화하여 버그의 가능성을 제한하여, 복잡성을 관리 할 수 ​​있도록 설계되었습니다. 학습을 즐기십시오. :) 이것은 Q & A 사이트입니다