Есть ли более чистый способ написания этого кода объективного кода? - PullRequest
4 голосов
/ 18 декабря 2010

Я новичок в Objective-C и программировании в целом. Я фельдшер, и я решил научиться программировать в объективной. У меня есть некоторый опыт работы с c, поэтому эта программа написана таким образом. Мне было интересно, если бы был более эффективный способ кодировать это с целью-c? Спасибо. (Программа компилируется без ошибок, поэтому, если где-то там есть синтаксическая ошибка, это, вероятно, потому, что я новичок в экранировании символов на платах внутри блоков кода)


#import &ltFoundation/Foundation.h>

void calcDiagnosis (float pHInput, int paCO2Input, int hCO3Input);

int main (int argc, const char * argv[]){
 int i;
 int repeat;
 i = 0;
 for(i = 0; i &lt 3; i++){
 //Initialize lab value variables
 float pH;
 int paCO2;
 int hCO3;

 //Introduction
 NSLog(@"Welcome to the ABG Lab Value Interpreter v1.0\n");
 NSLog(@"Please enter the necessary values.\n");

 //Gather the necessary values
 NSLog(@"Enter the pH value:");
 scanf("%f", &pH);
 NSLog(@"Enter the PaCO2 value:");
 scanf("%i", &paCO2);
 NSLog(@"Enter the HCO3 value:");
 scanf("%i", &hCO3);
 calcDiagnosis (pH, paCO2, hCO3);

 //Control Loop
 NSLog(@"Again?\n 1: Yes\n 2: No");
 scanf("%i", &repeat);

 switch (repeat){
 case 1: 
  i = 0;
  break;
 case 2:
  i = 3;
  break;
  }
 }

        return 0;
}

void calcDiagnosis (float pHInput, int paCO2Input, int hCO3Input)
{
 //Transfer the arguments to new variables
 float pH = pHInput;
 int paCO2 = paCO2Input;
 int hCO3 = hCO3Input;

 //////////////////////////////////
 //Diagnose Respiratory Acidosis//
 ////////////////////////////////

  //Acute
 if ((pH &lt 7.35) && (paCO2 > 45) && (hCO3 >=22 && hCO3 &lt=26)) {
  NSLog(@"Acute Respiratory Acidosis");
  }
  //Partially Compensated
 if ((pH &lt 7.35) && (paCO2 > 45) && (hCO3 >26)) {
  NSLog(@"Partially Compensated Respiratory Acidosis");
  }
  //Compensated
 if ((pH >= 7.35 && pH &lt= 7.45) && (paCO2 > 45) && (hCO3 >26)) {
  NSLog(@"Compensated Respiratory Acidosis");
  }

 ///////////////////////////////////
 //Diagnose Respiratory Alkalosis//
 /////////////////////////////////

  //Acute
 if ((pH > 7.45) && (paCO2 &lt 35) && (hCO3 >=22 && hCO3 &lt=26)) {
  NSLog(@"Acute Respiratory Alkalosis");
  }
  //Partially Compensated
 if ((pH > 7.45) && (paCO2 &lt 35) && (hCO3 &lt22)) {
  NSLog(@"Partially Compensated Respiratory Alkalosis");
  }
  //Compensated
 if ((pH >= 7.35 && pH &lt= 7.45) && (paCO2 &lt 35) && (hCO3 &lt22)) {
  NSLog(@"Compensated Respiratory Alkalosis");
  }

 //////////////////////////////////
 //Diagnose Metabolic Acidosis////
 ////////////////////////////////

  //Acute
 if ((pH &lt 7.35) && (paCO2 >= 35 && paCO2 &lt= 45) && (hCO3 &lt22)) {
  NSLog(@"Acute Metabolic Acidosis");
  }
  //Partially Compensated
 if ((pH &lt 7.35) && (paCO2 &lt 35) && (hCO3 >22)) {
  NSLog(@"Partially Compensated Metabolic Acidosis");
  }
  //Compensated
 if ((pH >= 7.35 && pH &lt= 7.45) && (paCO2 &lt 35) && (hCO3 &lt22)) {
  NSLog(@"Compensated Metabolic Acidosis");
  }

 //////////////////////////////////
 //Diagnose Metabolic Alkalosis///
 ////////////////////////////////

  //Acute
 if ((pH > 7.45) && (paCO2 >= 35 && paCO2 &lt= 45) && (hCO3 >26)) {
  NSLog(@"Acute Metabolic Alkalosis");
  }
  //Partially Compensated
 if ((pH > 7.45) && (paCO2 > 45) && (hCO3 >26)) {
  NSLog(@"Partially Compensated Metabolic Alkalosis");
  }
  //Compensated
 if ((pH >= 7.35 && pH &lt= 7.45) && (paCO2 > 45) && (hCO3 >26)) {
  NSLog(@"Compensated Metabolic Alkalosis");
  }

 //////////////////////
 //Diagnosis Normal///
 ////////////////////
 if ((pH >= 7.35 && pH &lt= 7.45) && (paCO2 >= 35 && paCO2 &lt= 45) && (hCO3 >= 22 && hCO3 &lt= 26)) {
  NSLog(@"Normal Values");
  }
 return;
}

Ответы [ 3 ]

6 голосов
/ 18 декабря 2010

Это может быть сложный вопрос.По мере того, как вы становитесь более опытным, вы будете чувствовать себя более комфортно с более продвинутыми концепциями.Проблема, над которой вы работаете, на самом деле довольно сложна и делает ее отличным инструментом обучения.

Ваша самая большая проблема заключается в том, что ваше текущее решение не использует какую-либо объектную ориентацию, что может усложнить его обслуживание и / илирасширяться в будущем.

В конечном счете, вопрос об оптимальной структуре кода может иметь много ответов, и вы можете не знать, что лучше, пока не будете дальше, пока вы не добавите больше функций в свою программу.

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

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

В любом случае, пожалуйста, не стесняйтесь задавать любые вопросы по следующим вопросам:

Vitals.h

#import <Foundation/Foundation.h>

@interface Vitals : NSObject {
    float _pH;
    int _paCO2;
    int _hCO3;
}

- (id) initWithPH:(float)pH paCO2:(int)paCO2 hCO3:(int)hCO3;

- (float) pH;
- (int) paCO2;
- (int) hCO3;

@end

Vitals.m

#import "Vitals.h"

@implementation Vitals

- (id) initWithPH:(float)pH paCO2:(int)paCO2 hCO3:(int)hCO3 {
    if (self = [super init]) {
        _pH = pH;
        _paCO2 = paCO2;
        _hCO3 = hCO3;
    }
    return self;
}

- (float) pH {return _pH;}
- (int) paCO2 {return _paCO2;}
- (int) hCO3 {return _hCO3;}

@end

Diagnosis.h

#import <Foundation/Foundation.h>
@class Vitals;

@interface Diagnosis : NSObject {
    NSString* _name;
    id _delegate;
    SEL _test;
}

- (id) initWithName:(NSString*)name delegate:(id)delegate test:(SEL)test;

- (NSString*) name;

- (BOOL) test:(Vitals*)vitals;

@end

Diagnosis.m

#import "Diagnosis.h"

@implementation Diagnosis

- (id) initWithName:(NSString*)name delegate:(id)delegate test:(SEL)test {
    if (self = [super init]) {
        _name = [name retain];
        _delegate = delegate;
        _test = test;
    }
    return self;
}
- (void) dealloc {
    [_name release];
    [super dealloc];
}

- (NSString*) name {return _name;}

- (BOOL) test:(Vitals*)vitals {
    return [(NSNumber*)[_delegate performSelector:_test withObject:vitals] boolValue];
}

@end

Doctor.h

#import <Foundation/Foundation.h>
@class Vitals;
@class Diagnosis;

@interface Doctor : NSObject {
    NSMutableArray* _diagnoses;
}

- (void) learnDiagnosis:(Diagnosis*)diagnosis;

- (Diagnosis*) diagnose:(Vitals*)vitals;

@end

Доктор.м

#import "Diagnosis.h"
#import "Doctor.h"

@implementation Doctor

- (id) init {
    if (self = [super init]) {
        _diagnoses = [[NSMutableArray alloc] init];
    }
    return self;
}
- (void) dealloc {
    [_diagnoses release];
    [super dealloc];
}

- (void) learnDiagnosis:(Diagnosis*)diagnosis {
    [_diagnoses addObject:diagnosis];
}

- (Diagnosis*) diagnose:(Vitals*)vitals {
    for (Diagnosis* diagnosis in _diagnoses) {
        if ([diagnosis test:vitals])
            return diagnosis;
    }
    return 0;
}

@end

Дифференциал.ч

#import <Foundation/Foundation.h>

@interface Differential : NSObject {}

- (void) teach:(Doctor*)doctor;

@end

Дифференциал.м

#import "Vitals.h"
#import "Diagnosis.h"
#import "Doctor.h"
#import "Differential.h"

@implementation Differential

- (NSNumber*) acuteRespiratoryAcidosis:(Vitals*)vitals {
    return [NSNumber numberWithBool:(([vitals pH] < 7.35) && ([vitals paCO2] > 45) && ([vitals hCO3] >=22 && [vitals hCO3] <=26))];
}
- (NSNumber*) partiallyCompensatedResporatoryAcidosis:(Vitals*)vitals {
    return [NSNumber numberWithBool:(([vitals pH] < 7.35) && ([vitals paCO2] > 45) && ([vitals hCO3] >26))];
}

- (void) teach:(Doctor*)doctor {
    Diagnosis* diagnosis;

    diagnosis = [[Diagnosis alloc] initWithName:@"Acute Respiratory Acidosis" delegate:self test:@selector(acuteRespiratoryAcidosis:)];
    [doctor learnDiagnosis:diagnosis];
    [diagnosis release];

    diagnosis = [[Diagnosis alloc] initWithName:@"Partially Compensated Respiratory Acidosis" delegate:self test:@selector(partiallyCompensatedResporatoryAcidosis:)];
    [doctor learnDiagnosis:diagnosis];
    [diagnosis release];
}

@end

Песочница.ч

#import <Foundation/Foundation.h>
#import "Vitals.h"
#import "Diagnosis.h"
#import "Doctor.h"
#import "Differential.h"

void run () {
    float pH=7.2;
    int paCO2=47;
    int hCO3=25;

    Doctor* doctor = [[Doctor alloc] init];
    Differential* differential = [[Differential alloc] init];
    [differential teach:doctor];

    Vitals* vitals = [[Vitals alloc] initWithPH:pH paCO2:paCO2 hCO3:hCO3];

    Diagnosis* diagnosis = [doctor diagnose:vitals];
    NSLog(@"%@",[diagnosis name]);

    [vitals release];
    [differential release];
    [doctor release];
}
0 голосов
/ 18 декабря 2010

Вы учите Objective-C писать программы для Mac или iPhone?Я буду считать это, потому что это, возможно, главная причина, по которой люди учатся этому.Если вы еще этого не сделали, вам следует заглянуть на веб-сайт Apple Developer, где есть много полезных руководств и т. Д. Я думаю, вам следует попробовать превратить это в приложение с графическим интерфейсом, поскольку таким образом вы будете использовать больше Objective-C и Cocoa.Вы действительно написали программу на C, за исключением NSLog () (и строк NSS внутри них). Вот хороший учебник.

0 голосов
/ 18 декабря 2010

Хотя есть несколько проблем с кодом, который вы разместили, самой большой проблемой является использование цикла for, где было бы более естественно использовать цикл while. for обычно используется для итерации (например, для чтения или записи в каждый элемент массива). while - обычно для повторения задачи несколько (но неопределенное) количество раз. Есть несколько способов сделать это, но простая модификация будет выглядеть следующим образом:

int main (int argc, const char * argv[]){

    int menu_input = 0;

    while(menu_input != 2){
     //Initialize lab value variables
     float pH;
     int paCO2;
     int hCO3;

     //Introduction
     NSLog(@"Welcome to the ABG Lab Value Interpreter v1.0\n");
     NSLog(@"Please enter the necessary values.\n");

     //Gather the necessary values
     NSLog(@"Enter the pH value:");
     scanf("%f", &pH);
     NSLog(@"Enter the PaCO2 value:");
     scanf("%i", &paCO2);
     NSLog(@"Enter the HCO3 value:");
     scanf("%i", &hCO3);
     calcDiagnosis (pH, paCO2, hCO3);

     //Control Loop
     NSLog(@"Again?\n 1: Yes\n 2: No");
     scanf("%i", &menu_input);
 }

return 0;

}

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

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