PDA

View Full Version : دریافت سه عدد از ورودی + اصول شی گرایی



Sina.iRoid
شنبه 22 شهریور 1393, 09:53 صبح
سلام. ممنون میشم اگر راهنماییم کنید.

من می خوام یه برنامه ای بنویسم که تعدادی عدد و از کاربر از طریق دیالوگ دریافت کنه و ماکسیمم اون اعداد و حساب کن. می خوام دقیقا تمام اصول شی گرایی رعایت بشه.

این کلاس : MaximumClass


package com.Java.iRoid;


public class MaximumClass {

double num1, num2, num3;

//---max method
public double max(double x, double y, double z){
setDimension(num1, num2, num3);
num3 = Math.max(y, z);
double result = Math.max(num3, x);
return result;
}

//---setDimension method
public void setDimension(double x, double y, double z){
x = num1;
y = num2;
z = num3;
}

//---setter method
public void setX(double x){
num1 = x;
}
public void setY(double y){
num2 = y;
}
public void setZ(double z){
num3 = z;
}
}


و این کلاس اصلی برنامه که هیچ کدی و داخلش ننوشتم.


package com.Java.iRoid;


public class DriverClass {

public static void main(String[] args){


}
}


سوال من اینجاست که من میخوام اعدادی که قرار کاربر وارد کنه، از طریق کلاس اصلی برنامه انجام بشه. لطفا راهنمایی کنید و اینکه می خوام برنامه اصول شی گرایی و رعایت کنه.
ممنون.

Sina.iRoid
شنبه 22 شهریور 1393, 11:14 صبح
دوستان من کدم و یه تغییراتی داخلش انجام دادم به این صورت شد:

MaximumClass


package com.Java.iRoid;


public class MaximumClass {

private double numOne;
private double numTwo;
private double numThree;
private double result;

public void max(double n1, double n2, double n3){
setNumber(n1, n2, n3);
n3 = Math.max(n2, n3);
double result = Math.max(n3, n1);
this.result = result;
}
//---setNumber method
public void setNumber(double n1, double n2, double n3){
setNumOne(n1);
setNumTwo(n2);
setNumThree(n3);
}

//---setter method
public void setNumOne(double n1){
numOne = n1;
}
public void setNumTwo(double n2){
numTwo = n2;
}
public void setNumThree(double n3){
numThree = n3;
}

//---toString method
public String toString(){
return ("The maximum number is: " + result);
}
}


DriverClass


package com.Java.iRoid;


import javax.swing.JOptionPane;


public class DriverClass {

public static void main(String[] args){

MaximumClass ob = new MaximumClass();

ob.setNumOne(Double.parseDouble(JOptionPane.showIn putDialog("Enter 1st num")));
ob.setNumTwo(Double.parseDouble(JOptionPane.showIn putDialog("Enter 2nd num")));
ob.setNumThree(Double.parseDouble(JOptionPane.show InputDialog("Enter 3rd num")));

JOptionPane.showMessageDialog(null, ob, "Time", JOptionPane.INFORMATION_MESSAGE);
}
}


ولی جواب صفر میشه. ممنون اگر راهنماییم کنید.

h.gheidrlou
شنبه 03 مرداد 1394, 23:09 عصر
لطفا همین کد را برای سی شارپ هم بنویسید

[younes]
یک شنبه 04 مرداد 1394, 10:51 صبح
ولی جواب صفر میشه. ممنون اگر راهنماییم کنید.

اولا شما در هیچ جای برنامه از متد max کلاس MaximumClass استفاده نکردید.
وقتی از seter های one two tree استفاده میکنید دادن سه آرگومان ورودی به متد max بی معنیه چون max از فیلد های numOne numTow numThree استفاده میکنه که قبلا با seter مقدار دهی شدند و دیگه نیازی به این کار نیست. و با توجه به کلاس شما بهتره متد max را یکبار بدون آرگومان overload کنید.


و برای استفاده در متد main باید:



public static void main(String[] args){
MaximumClass ob = new MaximumClass();
ob.setNumOne(Double.parseDouble(JOptionPane.showIn putDialog("Enter 1st num")));
ob.setNumTwo(Double.parseDouble(JOptionPane.showIn putDialog("Enter 2nd num")));
ob.setNumThree(Double.parseDouble(JOptionPane.show InputDialog("Enter 3rd num")));
ob.max();
JOptionPane.showMessageDialog(null, ob, "Time", JOptionPane.INFORMATION_MESSAGE);
}



و یا :


public static void main(String[] args){

MaximumClass ob = new MaximumClass();
double n1= Double.parseDouble(JOptionPane.showInputDialog("Enter 1st num"));
double n2= Double.parseDouble(JOptionPane.showInputDialog("Enter 2nd num"));
double n3= Double.parseDouble(JOptionPane.showInputDialog("Enter 3rd num"));
ob.max(n1,n2,n3);

JOptionPane.showMessageDialog(null, ob, "Time", JOptionPane.INFORMATION_MESSAGE);

ahmad.mo74
یک شنبه 04 مرداد 1394, 16:29 عصر
سلام.

توی شی گرایی، باید این 3 اصول اولیه رو رعایت کنید :

- Encapsulation : تمامی فیلدها private، در صورت نیاز setter و getter تعریف میکنیم.
- Inheritance
- Polymorphism

حالا با توجه به توضیحی که درباره Encapsulation دادم، سعی کن یبار دیگه کدت رو بازنویسی کنی.

در مورد پیدا کردن بزرگترین و کوچکترین عدد هم، روشی قشنگ تری هم هست. هر بار که عددی رو از کاربر میگیری، همون موقع با مقایسه کردن با max یا min قبلی، مقدارهای جدید رو پیدا کن.
یعنی مثلا :


import java.util.ArrayList;
import java.util.List;
import java.util.Objects;


/**
* @author avb
*/
public class DataSet<T extends Comparable<T>> {


private final List<T> list = new ArrayList<>();
private T max;
private T min;


public void add(T t) {
Objects.requireNonNull(t);
if (list.isEmpty()) {
max = t;
min = t;
} else {
if (t.compareTo(max) > 0) {
max = t;
} else if (t.compareTo(min) < 0) {
min = t;
}
}
list.add(t);
}


public boolean remove(T t) {
return list.remove(t);
}


public T removeAt(int index) {
return list.remove(index);
}


public T max() {
return max;
}


public T min() {
return min;
}


public void clear() {
list.clear();
}


@Override
public String toString() {
return list.toString();
}


public static void main(String[] args) {
DataSet<Integer> set = new DataSet<>();
set.add(1);
set.add(-1);
set.add(2);
System.out.println("max = " + set.max());
System.out.println("min = " + set.min());
System.out.println(set);
}


}

محمد فدوی
یک شنبه 04 مرداد 1394, 16:42 عصر
من می خوام یه برنامه ای بنویسم که تعدادی عدد و از کاربر از طریق دیالوگ دریافت کنه و ماکسیمم اون اعداد و حساب کن. می خوام دقیقا تمام اصول شی گرایی رعایت بشه.
همیشه یه برنامه نیاز نیست طبق استانداردهای شیءگرایی طراحی بشه. در واقع همونطور که الگو‌های طراحی (Design Pattern) می‌تونن به‌راحتی تبدیل به یه ضدالگو (Anti-pattern) بشن، خود شیءگرایی هم همواره مفید نیست... باید مسئله‌ای که باش روبرویی «به واقع» شیءگرا باشه تا برنامه‌نویسی شی‌ءگرا مفید باشه!
مثال می‌زنم؛ من می‌خوام یه روبوت سخن‌گو بنویسم که یه‌سری رفتار (Behavior) مثل صحبت کردن، تصمیم‌گیری، تحرک و... رو از خودش نشون بده؛ بخشی از این رفتارها مثل صحبت کردن بروز بیرونی دارن و بعضی دیگه مثل تجزیه و تحلیل و مدار یادگیری، هیچوقت به‌خودی خود بروز پیدا نمی‌کنن، و در ضمن بهتره از دیدرس ناظر بیرونی خارج باشن. این روبوت تعدادی خصوصیت (Property) هم احتمالا داره، مثل میزان شارژ، نام، تنظیمات زبان و... خب خیلی روشنه که برنامه‌نویسی این روبوت باید شیءگرا باشه. چون ما واقعا با یه شیء طرفیم.

اما آیا این معنیش اینه که هرمسئله‌ای شیءگراست؟ نه.
بذار سعی کنم یه مسئله‌ی غیرشیءگرا رو بی‌دلیل شیءگرا کنم! می‌خوام برنامه‌ای بنویسم که دوعدد از کاربر بگیره و جمعشون رو چاپ کنه. خب! چون قراره شیءگرا بنویسم پس یه کلاس نیاز دارم که وظیفه‌ش خوندن دوعدد از ورودی کاربر باشه مثلا به نام TwinScanner. به کلاسی نیاز دارم که دوعدد رو بگیره و جمعشون رو محاسبه کنه؛ اسم اینم می‌ذارم TwinSum. و درنهایت یه کلاس نیاز دارم که جمع محاسبه شده رو طی یه فرمت خوب به کاربر نشون بده مثلا به نام TwinOutput. ولی واقعا برای این برنامه به سه‌کلاس نیاز بود؟! اصلا آیا این کلاس‌هایی که نام بردم لزومی به وجودشون هست؟
تازه من زیاد سخت‌گیری نکردم وگرنه بیش‌از اینا می‌شد کلاس بی‌دلیل تعریف کرد!!!
پس خیلی وقتا استفاده از شیءگرایی هم خوانایی و هم کارایی برنامه رو کاهش می‌ده و درضمن عیب‌یابی‌ش رو هم مشکل می‌کنه. در واقع من برای پیاده‌سازی این برنامه صرفا به یه برنامه‌ی ساخت‌یافته نیاز دارم نه یه برنامه‌ی شیءگرا.

برنامه‌ی شمام مشابه همینه (البته می‌دونم که برنامه‌ت رو صرفا برای تمرین می‌نویسی...) ولی هرچقدر هم که سعی کنی استانداردهای شیءگرایی رو توش رعایت کنی درنهایت به یه برنامه‌ی اصطلاحا کاریکاتوری می‌رسی. کافیه برنامه‌ت رو مرتب بنویسی، احیانا متدهای موردنیازت رو با نام و متن مناسب تعریف/استفاده کنی و برنامه‌ت رو تمیز نگه‌داری. در عوض اگه به پیاده‌سازی شیءگرا علاقه داری، برو سمت مسائل واقعا شیءگرا.

موفق باشی.