Sizce bir kodlama dilinde olması gereken en büyük özellik ne?

OOP'yi sadece Klasör, kısayol olarak düşünmeyin. Çok şekillilik ve kalıtım işleri belli durumlarda çok kolaylaştırabiliyor.
Ayrıca Nesne yönelimli olmak kodların tekrar kullanılabilirliğini artırır ve tekrarı azaltır.
Bir işi yapan bir A Class'ınız olsun. Sadece belli bir kısmını değiştirerek yeni bir B Class(Obje)'ı oluşturmak istediğiniz zaman. B'yi A'dan kalıtıp (Inheritance, Extend). B'nin A'dan farklı olmasını istediğiniz şeyleri Override edersiniz. Böylece B için A'da zaten bulunan kodları tekrardan yazmamış olursunuz. Class içerisinde Access Modiferları(private, public, protected, package private gibi) düzgün ayarlamışsanız(Encapsulation). Diğer Objelerin A ve B Objesinin sahip olduğu değişkenlere ve prosedürlere erişimini kısıtlamış olursunuz.

Daha anlatmak istediğim çok şey var ama varsayım yerine bir örnek üzerinden anlatmam gerekiyor.
Böyle anlatınca baya havada kalıyor.
 
Oop'yi sadece klasör, kısayol olarak düşünmeyin. Çok şekillilik ve kalıtım işleri belli durumlarda çok kolaylaştırabiliyor.
Ayrıca nesne yönelimli olmak kodların tekrar kullanılabilirliğini artırır ve tekrarı azaltır.
Bir işi yapan bir a class'ınız olsun. Sadece belli bir kısmını değiştirerek yeni bir b class(obje)'ı oluşturmak istediğiniz zaman. B'yi A'dan kalıtıp (ınheritance, extend). B'nin A'dan farklı olmasını istediğiniz şeyleri override edersiniz. Böylece b için A'da zaten bulunan kodları tekrardan yazmamış olursunuz. Class içerisinde Access modiferları(private, public, protected, package private gibi) düzgün ayarlamışsanız(encapsulation). Diğer objelerin A ve B objesinin sahip olduğu değişkenlere ve prosedürlere erişimini kısıtlamış olursunuz.

Daha anlatmak istediğim çok şey var ama varsayım yerine bir örnek üzerinden anlatmam gerekiyor.
Böyle anlatınca bayağı havada kalıyor.

Anladım bu özellikleri hiç nesne yönelimliliğe girmeden yapmaya çalışcam.
Bir de yeniden yazmama bunda da var o şeyi bir dosya içine yazarsanız ana dosyadan istediğiniz gibi kullanabilirsiniz ya da başka bir dosyadan istediğiniz gibi kullanabilirsin.
Bir de anlatın ben anlattıklarınızı geri dönüş olarak alırım.
Hatta dlang biliyorsanız bana yardım etmenizi bile isterim.
 
Son düzenleme:
Functional ve OOP destegi. ( Javadaki primitif tipler ya da PHP deki is_object gibi fonksiyonlar OOP yi bozuyor )
Syntaxinin kullanisli ve temiz olmasi.
Kod:
x <- 54
Bu sekilde variable tanimladigin diller var ( R ). Cirkin. PHP de cirkin bana gore.
Null safety destegi. ( Kotlindeki gibi )
Immutability destegi.
Guzel Enum destegi. ( C# enumlari yeterince becerikli degil )
Hafif thread destegi. ( Go coroutine gibi , Java thread'leri cok agir. )
Birden fazla interpretore compile edilebilmesi. ( Kotlin gibi )
Otomatik try-catch-resource handling mekanizmasi. ( Java - Kotlin - C# daki gibi. Kotlin ve C# bu konuda daha iyi, use & using )
Saglam reflection ve annotation destegi. ( JVM dilleri bu konuda cok basarili )
Async fonksiyon destegi. ( JS gibi callback hell olmak zorunda degil -> Callback Hell)

"static final readonly " gibi keyword karmasasi dilleri sevmiyorum ( C# ). Feature-rich gorunmeye calisiyor ama zaten cogu dilin "const" keywordu ile yaptigi seyin tamamen aynisini yapiyor.

Ayrica underscore syntaxini gereksiz kullanan dilleri de sevmiyorum.
Kod:
def __init__()

Suna adam gibi init: desenize arkadasim, gozu yoruyorsunuz bos yere.

Deconstructor sevmiyorum. C / C++ ailesinde var ama memory management otomatik olduktan sonra gereksizlesiyor. GC ile de performansli olabilir bir dil, bkz: Go. GC olduktan sonra deconstructor'a da gerek yok. Ille kullanacaksan "Closable" patterni kullan, JVM dillerinin yaptigi gibi.

Son olarak : Kodlama dili degil, programlama dili : )
 
Son düzenleme:
Python'un syntax'ı benim de gözümü yoruyor. Ben girinti saymak istemiyorum. Ver bana curly bracketi istediğim yerde başlatıp bitireyim.
Benzer şekilde saçma isimlendirmeler de mevcut; datetime.datetime.now() gibi bir yapıyı kim nasıl mantıklı gördü? Ve diğerleri buna nasıl izin verdiler?

@Mehmet_Can

Java:
import java.util.ArrayList;

public class Main
{

    public static void main(String[] args)
    {
        ArrayList<Shape> myShapes = new ArrayList<>();
        myShapes.add(new Square(25));
        myShapes.add(new Circle(50));
        myShapes.add(new Rectangle(10, 30));
        myShapes.add(new Circle(76));
        myShapes.add(new Square(314));

        for (Shape shape : myShapes)
        {
            System.out.printf("%s's Area = %.3f; Perimeter = %.3f\n", shape, shape.getArea(), shape.getPerimeter());
        }
    }
}
Java:
import javafx.geometry.Point2D;

public abstract class Shape
{

    protected String name;
    protected double x;
    protected double y;

    public Point2D getCoordinate()
    {
        return new Point2D(this.x, this.y);
    }

    public void setCoordinate(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public void setCoordinate(Point2D coor)
    {
        setCoordinate(coor.getX(), coor.getY());
    }

    public abstract double getPerimeter();

    public abstract double getArea();

    @Override
    public String toString()
    {
        return this.name;
    }
}
Java:
public class Square extends Shape
{

    private double edge;

    public Square(double edge)
    {
        setEdge(edge);
        this.name = "Square";
    }

    public Square()
    {
        this(0);
    }

    public void setEdge(double edge)
    {
        if (edge < 0)
        {
            this.edge = 0; // Length can not be Negative Value!
        } else
        {
            this.edge = edge;
        }
    }

    public double getEdge()
    {
        return this.edge;
    }

    @Override
    public boolean equals(Object obj)
    {
        return (this.edge == ((Square) obj).getEdge());
    }

    @Override
    public double getPerimeter()
    {
        return 4 * this.edge;
    }

    @Override
    public double getArea()
    {
        return Math.pow(edge, 2);
    }
}
Java:
public class Rectangle extends Shape
{

    private double edgeA;
    private double edgeB;

    public Rectangle()
    {
        this(0, 0);
    }

    public Rectangle(double edgeA, double edgeB)
    {
        setEdgeA(edgeA);
        setEdgeB(edgeB);
        this.name = "Rectangle";
    }

    public void setEdgeA(double edge)
    {
        if (edge < 0)
        {
            this.edgeA = 0; // Length can not be Negative Value!
        } else
        {
            this.edgeA = edge;
        }
    }

    public void setEdgeB(double edge)
    {
        if (edge < 0)
        {
            this.edgeB = 0; // Length can not be Negative Value!
        } else
        {
            this.edgeB = edge;
        }
    }

    public double getEdgeA()
    {
        return this.edgeA;
    }

    public double getEdgeB()
    {
        return this.edgeB;
    }

    @Override
    public boolean equals(Object obj)
    {
        return (this.edgeA == ((Rectangle) obj).getEdgeA() &&
                this.edgeB == ((Rectangle) obj).getEdgeB());
    }

    @Override
    public double getPerimeter()
    {
        return 2 * (this.edgeA + this.edgeB);
    }

    @Override
    public double getArea()
    {
        return this.edgeA * this.edgeB;
    }
}
Java:
public class Circle extends Shape
{

    private double radius;


    public Circle()
    {
        this(0);
    }

    public Circle(double radius)
    {
        setRadius(radius);
        this.name = "Circle";
    }

    public void setRadius(double radius)
    {
        if (radius < 0)
        {
            this.radius = 0;
        } else
        {
            this.radius = radius;
        }
    }

    public double getRadius()
    {
        return this.radius;
    }

    @Override
    public boolean equals(Object obj)
    {
        return (this.radius == ((Circle) obj).getRadius());
    }

    @Override
    public double getPerimeter()
    {
        return 2 * Math.PI * this.radius;
    }

    @Override
    public double getArea()
    {
        return Math.PI * Math.pow(this.radius, 2);
    }
}

OOP'nin 4 kuralını basit de olsa kullanan bir örnek yazdım. Çok klişe olduğunun farkındayım. Ama Nesne mantığını anlamak için güzel bir örnek.
 
Python'un syntax'ı benim de gözümü yoruyor. Ben girinti saymak istemiyorum. Ver bana curly bracketi istediğim yerde başlatıp bitireyim.
Herkes Python için okuması kolay deyince bende mi sıkıntı var da hoşuma gitmiyor diyordum. Meğer benlik bir durum değilmiş sadece.

Ek olarak birisi buraya Python ile yazılmış kod eklediğinde girintiler giderse kodları bozuluyor.
 
Son düzenleyen: Moderatör:
Yorumlanması da ayrı bir dert. Çok kritik bir hatayı RunTime'da fark etmek baya kötü oluyor.
White Space sorunu var ayrıca. Bazı yorumlama ortamları Tab'ları 4 space'e çevirebiliyor.
Ama bazıları Tab'ı tab olarak tuttuğu için garip buglar oluşabiliyor.
Veya gözden kaçırıp 4 yerine 3 boşluk atınca yorumlayıcı o kısımı girintiden saymıyor.
Noktalı virgül gibi satır bitirme sembolü olmadığı için benim sıkça kullandığım line break Python'da işkenceye dönüşüyor. \ istiyor her kırılan satır için;
1599332023968.png

Bu yapı daha hoşuma gidiyor şahsen.
 
Peki burada dlang bilen hiç mi yok.
Bir de bir dahakine programlama dili derim.
Bir de tamam elimden geldiğince oop tipi yapmaya çalışırım bir de çok noktalı olmayacak şu anlık direkt yorumlandığı için başka yorumlayıcılarda çalışmayacak bir de moleküler yapıda dediğim şekilde olacak teşekkürler.
Şu anlık benim fikrim abrasct (doğru yazdım mı bilmiyorum) classları geçirmeye tekrar kullanılabilirliği geçirmemeye çünkü zaten bunun benzeri var kalıtımı geçireyim çok yönlülüğü ise pek anlamadım.
 
Son düzenleme:
Yorumlanması da ayrı bir dert. Çok kritik bir hatayı RunTime'da fark etmek baya kötü oluyor.
White Space sorunu var ayrıca. Bazı yorumlama ortamları Tab'ları 4 space'e çevirebiliyor.
Ama bazıları Tab'ı tab olarak tuttuğu için garip buglar oluşabiliyor.
Veya gözden kaçırıp 4 yerine 3 boşluk atınca yorumlayıcı o kısımı girintiden saymıyor.
Noktalı virgül gibi satır bitirme sembolü olmadığı için benim sıkça kullandığım line break Python'da işkenceye dönüşüyor. \ istiyor her kırılan satır için;
Eki Görüntüle 659079
Bu yapı daha hoşuma gidiyor şahsen.
Beni o kodda 2 sey rahatsiz etti:
1) "{" if ' in yaninda olmali bence.
2) Bir de putIfAbsent() zaten contains kontrolu yapiyor kendi icinde.
 

Yeni konular

Geri
Yukarı