• 0

Rules we learn at school


Question

Hello everyone!

I've recently started my studies (Bachelor of Applied Computer Science), and in our OOP-classes we've been using Java to get familiar with Object Oriented programming concepts in general (so not focusing on the Java API but mainly on object relations, calling methods on other objects, call by reference/value etc etc).

We do learn a few rules for our code though. Things we should do:

  • never use more than one return statement
  • never use break or continue
  • avoid using switch

I am, of course, all but an experienced programmer, but I quite like these principles. Whenever we see a code example that has multiple returns or uses break or continue it takes a while to understand, while code with a single return and without breaks/continues always looks quite clean and easy to understand. I personally never felt limited by these rules either.

What do you guys think?

Link to comment
https://www.neowin.net/forum/topic/1045461-rules-we-learn-at-school/
Share on other sites

Recommended Posts

  • 0

Switches and if - else if - else statements some times lead to messy code

Point is to make the code small in size and easy to understand - this may refactoring to use continue and break statements or vice-versa refactoring breaks and continues to loop conditions and if statements and switches

  • 0

Wouldn't initializing your variables (another good rule of thumb) solve that problem:


while (!eof(file))
dataOffset = -1;
dataLength = -1;
header = file.readbytes(22)
if (isValidHeader(header))
dataOffset = int(file.readbytes(4))
if (dataOffset >= 0)
file.seek(dataOffset)
dataLength = int(file.readbytes(4))
if (dataLength >= 0)
dataChunk = file.readbytes(dataLength)
store(dataChunk)
// process dataChunk...
[/CODE]

That mitigates the issue, but leaves most of the code indented. Also, it's not strictly equivalent because you'll have to go through all the ifs everytime whereas my version continues to the next loop as soon as the first error is detected. Also, now you initialise your variables twice (once to the error value, and another time to the real value) instead of once. (btw my code didn't have any uninitialised variables. They were declared at the point of initialisation)

Also your version is more error-prone because what happens if someone adds some logic before the end of the while loop. He has to remember to put it inside the last if (condition) because otherwise it'll execute for an invalid record. Whereas when you break early with continue, no code can be executed for invalid records by mistake.

  • 0
If you need to know the type of a variable, get a good IDE and hover your mouse over it. Including the type in the variable name, leads to garbage in front of the useful name. It also adds a maintenance nightmare when variable types are changed. A good example is in Win32 LPCSTR is defined to be a char const * It stands for "Long Pointer to Constant STRing" the long part is completely irrelevant nowdays. But Windows is stuck with it for backwards compatibility.

I prefer not to use the mouse too much while programming. I also don't see the big deal about changing variable types. Good code is portable and thus, you don't need to change the notation. I am not suggesting that all type information should be in the name, just a p for pointers, a for arrays, t for typecasts: that sort of thing.

I implement network protocols and there is a lot of packet encoding and decoding involved. Seeing a variable and knowing what it is definitely helps.

I am not claiming that this is useful everywhere, just that it is a rule I like to follow.

  • 0

I prefer not to use the mouse too much while programming. I also don't see the big deal about changing variable types. Good code is portable and thus, you don't need to change the notation. I am not suggesting that all type information should be in the name, just a p for pointers, a for arrays, t for typecasts: that sort of thing.

I implement network protocols and there is a lot of packet encoding and decoding involved. Seeing a variable and knowing what it is definitely helps.

I am not claiming that this is useful everywhere, just that it is a rule I like to follow.

If you can't remember the types that you're using, or anything of that nature. Then you shouldn't be programming. You should be using smart variable naming conventions, not crappy polluted names that are not helpful at all. If you wanna change the type then you will have to change the variable name, and yet bring source compatibility and even binary compatibility. I write a network protocol, and I don't use all that garbage type in variable stuff. Btw it's not a rule, it's just your preference, and a bad one at that.

  • 0

If you can't remember the types that you're using, or anything of that nature. Then you shouldn't be programming. You should be using smart variable naming conventions, not crappy polluted names that are not helpful at all. If you wanna change the type then you will have to change the variable name, and yet bring source compatibility and even binary compatibility. I write a network protocol, and I don't use all that garbage type in variable stuff. Btw it's not a rule, it's just your preference, and a bad one at that.

Do you honestly remember the type of every variable you declare? I wonder if you have ever written more than 1000 lines in a program. UINT4 u4Variable is 4 bytes of memory, plain and simple. If you are porting it to a different platform, you modify what UINT4 refers to so that it still means 4 bytes of memory. If there is a possibility that you may need more than 4 bytes of memory for that particular purpose in the future, you should be using a more flexible type in the first place.

Naturally, there are tools that make all this redundant, but there is nothing wrong in relying less on them. I honestly feel that all these tools take the fun out of programming- you feel like a part of an assembly line rather than a human being capable of making intelligent decisions.

  • 0

Do you honestly remember the type of every variable you declare? I wonder if you have ever written more than 1000 lines in a program. UINT4 u4Variable is 4 bytes of memory, plain and simple. If you are porting it to a different platform, you modify what UINT4 refers to so that it still means 4 bytes of memory. If there is a possibility that you may need more than 4 bytes of memory for that particular purpose in the future, you should be using a more flexible type in the first place.

Naturally, there are tools that make all this redundant, but there is nothing wrong in relying less on them. I honestly feel that all these tools take the fun out of programming- you feel like a part of an assembly line rather than a human being capable of making intelligent decisions.

If you are changing types to match a new system, you are doing it wrong. You should be using uint32_t and friends and having it done for you.

The tools are there to help you, the way I see it is that I'm the creative one coming up with the way it should be done. My lovely IDE just colours it nicely and puts a squiggly red line if I make a mistake typing it in.

  • 0

If you are changing types to match a new system, you are doing it wrong. You should be using uint32_t and friends and having it done for you.

The tools are there to help you, the way I see it is that I'm the creative one coming up with the way it should be done. My lovely IDE just colours it nicely and puts a squiggly red line if I make a mistake typing it in.

I am not sure I follow. Each chipset manufacturer provides a set of APIs and basic data types that their OS variant (usually some variant of Linux butchered to suit their requirements) supports. Our code is completely portable: we just have to match our data types with what the underlying architecture supports. As we cannot compromise on performance, we have to port for each environment.

Edit: Just to be clear, I am talking about C.

  • 0

I am not sure I follow. Each chipset manufacturer provides a set of APIs and basic data types that their OS variant (usually some variant of Linux butchered to suit their requirements) supports. Our code is completely portable: we just have to match our data types with what the underlying architecture supports. As we cannot compromise on performance, we have to port for each environment.

Edit: Just to be clear, I am talking about C.

Ah, I was thinking that you had stdint.h available and configured for each system

  • 0

Do you honestly remember the type of every variable you declare? I wonder if you have ever written more than 1000 lines in a program. UINT4 u4Variable is 4 bytes of memory, plain and simple. If you are porting it to a different platform, you modify what UINT4 refers to so that it still means 4 bytes of memory. If there is a possibility that you may need more than 4 bytes of memory for that particular purpose in the future, you should be using a more flexible type in the first place.

Naturally, there are tools that make all this redundant, but there is nothing wrong in relying less on them. I honestly feel that all these tools take the fun out of programming- you feel like a part of an assembly line rather than a human being capable of making intelligent decisions.

I've wrote a project with code lines over 25,000. I remember everything, that I write. I also use "auto" a lot in C++. My code completion gives me all the type information. Obviously you ain't using a decent IDE that does that. You can blame that on yourself. Just because you probably develop in notepad, or vim, or something doesn't make you better. But wasting your time prefixing every stupid variable with a type makes no sense. You are just making yourself do that much more work, and to maintain. If you prefer that much work, then continue. I rather just get the stuff over with, and keep my source compatibility and binary compatibility, while keeping my source code neat and not have "hungarian notation" garbage in my code.

If you really want to see my code, just pm me and i'll give you the link (even though my repo is outdated, and the most updated isn't on there).

  • 0

I've wrote a project with code lines over 25,000. I remember everything, that I write. I also use "auto" a lot in C++. My code completion gives me all the type information. Obviously you ain't using a decent IDE that does that. You can blame that on yourself. Just because you probably develop in notepad, or vim, or something doesn't make you better. But wasting your time prefixing every stupid variable with a type makes no sense. You are just making yourself do that much more work, and to maintain. If you prefer that much work, then continue. I rather just get the stuff over with, and keep my source compatibility and binary compatibility, while keeping my source code neat and not have "hungarian notation" garbage in my code.

If you really want to see my code, just pm me and i'll give you the link (even though my repo is outdated, and the most updated isn't on there).

Tell me this. When you are browsing a lot of code, wouldn't you like to see at a glance what the type of each variable is, especially when much of the code is written by someone else? Would you rather hover over each variable to see what type it is? If you are not convinced by my argument, let us agree to differ.

  • 0

Tell me this. When you are browsing a lot of code, wouldn't you like to see at a glance what the type of each variable is, especially when much of the code is written by someone else? Would you rather hover over each variable to see what type it is? If you are not convinced by my argument, let us agree to differ.

Why would I care about that? You're trying too hard to convince me into supporting MS Hungarian notation.

  • 0

Tell me this. When you are browsing a lot of code, wouldn't you like to see at a glance what the type of each variable is, especially when much of the code is written by someone else? Would you rather hover over each variable to see what type it is? If you are not convinced by my argument, let us agree to differ.

I work on a project that has 1.3 million lines of code, and I've never had a problem with that, Visual Studio just makes it to easy to figure stuff out on the fly as you type

  • 0

Tell me this. When you are browsing a lot of code, wouldn't you like to see at a glance what the type of each variable is, especially when much of the code is written by someone else? Would you rather hover over each variable to see what type it is? If you are not convinced by my argument, let us agree to differ.

So do you create an abbreviation for every type you create? Or is it just for built-in types? There are about a million built-in types in .NET (or Java or whatever framework you use): do you have abbreviations for all those? Or is it just for basic numeric types and strings? I don't see how that convention can be enforced in a way that is both coherent and practical.
  • 0

I use multiple returns especially in validation functions. Default the return to invalid and put the validated return inside an if--makes for a very short function:


bool CheckBounds(int number, int upper, int lower)
{
if (number >= lower && number <= upper)
{
return true;
}
return false;
}
[/CODE]

  • 0

I use multiple returns especially in validation functions. Default the return to invalid and put the validated return inside an if--makes for a very short function:

bool CheckBounds(int number, int upper, int lower)
{
	if (number &gt;= lower &amp;&amp; number &lt;= upper)
	{	  
		return true;
	}  
	return false;
}
[/CODE]


Even Shorter :)
[code]
bool CheckBounds(int number, int upper, int lower)
{
    return (number &gt;= lower &amp;&amp; number &lt;= upper);
}

  • 0
Do you honestly remember the type of every variable you declare? I wonder if you have ever written more than 1000 lines in a program. UINT4 u4Variable is 4 bytes of memory, plain and simple. If you are porting it to a different platform, you modify what UINT4 refers to so that it still means 4 bytes of memory. If there is a possibility that you may need more than 4 bytes of memory for that particular purpose in the future, you should be using a more flexible type in the first place. Naturally, there are tools that make all this redundant, but there is nothing wrong in relying less on them. I honestly feel that all these tools take the fun out of programming- you feel like a part of an assembly line rather than a human being capable of making intelligent decisions.

What are you actually writing, because really you shouldn't have to change your code every time you port it to a different system (In that case the code isn't that portable), unless you're dealing with some strange embedded systems.

But even then, in your example you're using a plain 32bit integer, I don't know what type of computer wouldn't handle those well.

  • 0

So do you create an abbreviation for every type you create? Or is it just for built-in types? There are about a million built-in types in .NET (or Java or whatever framework you use): do you have abbreviations for all those? Or is it just for basic numeric types and strings? I don't see how that convention can be enforced in a way that is both coherent and practical.

I work on C. We follow this convention for basic data types (numerical, p-pointer, a-array, g-global), not for structures.

What are you actually writing, because really you shouldn't have to change your code every time you port it to a different system (In that case the code isn't that portable), unless you're dealing with some strange embedded systems.

But even then, in your example you're using a plain 32bit integer, I don't know what type of computer wouldn't handle those well.

The code isn't changed, the portability layer is. The point I was trying to make is that there will be no need for me to change the prefixes every time I port to a different architecture. That is why I chose that particular example.

Let me reiterate: this is a rule my department follows and I am a fan. There may be many reasons why the Hungarian notation is not used, but the disadvantages do not affect us and it also provides valuable information about data types at one glance. I think many of you are referring to higher level languages that don't have direct memory manipulation, where the editor will provide type checking. It is not possible in the code we write and we need to easily know how many bytes to memcpy.

To be honest, when I put up the post about rules, it was a set of personal rules I like to follow. I am not saying that these rules that are applicable or convenient to everyone.

  • 0

if any API or other pre-programmed structure is supposedly forcing you to use goto to handle errors then there is something fundamentally wrong with it and is a regular target for hackers. can you probably make more efficient code with goto. Yeah, used correctly. But that's not really the point. If you wanted the worlds most efficient code you would be programming in assembly anyway.

Finally, something we can agree upon. :)

This topic is now closed to further replies.
  • Posts

    • Trailer park trash “sport “, fits the current White House
    • KataLib 5.3.0.0 by Razvan Serea KataLib is more than just a music player — it's a complete audio suite designed for music lovers and creators alike. It combines a powerful audio player, a flexible metadata editor, a capable audio converter, and a music library manager into one streamlined application. Core Features: Audio Player Enjoy seamless playback of virtually any audio format or even streaming video files. DJ Mode lets you mix tracks with manual or automatic crossfades. You can also load and save WinAmp-style playlists for quick access to your favorite sets. Audio Converter Convert between a wide range of audio formats effortlessly. Trim or normalize your output automatically, and even extract audio from streaming video sources. Ideal for preparing files for different devices or platforms. Metadata Editor View and edit ID3v2 tags and other metadata. Batch edit multiple files at once, and fetch missing information directly from the MusicBrainz database. You can also apply or update album art with ease. Music Library Manager Organize your entire audio collection, search across tracks instantly, and download cover images from the internet — or use your own custom artwork. KataLib makes it easy to keep your library tidy and enriched with useful info. Supported Formats: KataLib supports a wide range of both lossy and lossless audio formats: Input: OPUS, AAC, FLAC, M4A, MP3, MP4, MPC, APE, AIF, MKV, AVI, MOV, FLV, WEBM, Ogg Vorbis, WAV, WAVPack, WMA, AC3, OGA, MP2, MPGA, MPEG, DTS, M4B, DSD (DFS) Output: OPUS, FLAC, M4A, MP3, Ogg Vorbis, WAV Under the hood, KataLib uses the trusted FFmpeg engine for audio conversion and media playback, ensuring compatibility with virtually all mainstream media formats. KataLib 5.3.0.0 changelog: Added Option to select the Zoom level of the Oscilloscope visualizer. The taskbar button of the app now displays the progress of its processing tasks. The metadata text of the Visualization Video can now be aligned by the user. We can now reorder the order of the Visualizers and Metadata, in the Visualization Video Setup dialog, by removing any item and adding it again. It will be added at the end. Changed The font size of the Visualization Video can now be more than 30 points. Updated yt-dlp library to version 2026... Fixed Opening the Visualization Video Setup dialog could fail if the settings were wrong. Sometimes there were false duplicates in the Rename Tracks dialog. Tracks without metadata appeared without title in the Recent menu. Download: KataLib 5.3.0.0 | 90.0 MB (Open Source) Links: KataLib Home Page | Github | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • EA Sports UFC 6 review: Brutal, satisfying, and surprisingly accessible to newcomers by Pulasthi Ariyasinghe EA’s UFC series of fighting games has been putting out games for over 10 years now, but it’s a series I have never spent any time with. As a PC guy, the series being console-exclusive is the primary reason for that. The latest entry to the series, EA Sports UFC 6, is still not coming to PC, but I have an Xbox now. When EA reached out to see if I could have a crack at the game and give my opinion about it, I finally got the chance to see what this franchise is about. I have spent about a week playing UFC 6 on the Xbox Series X. Despite my lackluster skill with fighting games, I still have fun with entries like Street Fighter and Tekken. I quickly came to realize this is a different kind of fighting game, not the arcade titles I am usually dabbling with. Most of the week that I spent playing UFC 6 was in the career mode, trying not to get knocked out while slowly improving my combos and reactions. The review below will be from the perspective of a newcomer to the series and an amateur fighting game fan, so please forgive any mistyped lingo or series-staple mechanics I am not comprehending. In the Ring Getting a solid hit in UFC 6 is satisfying. It’s probably the most satisfying impact reaction I have seen in a fighting game. The ripples in the muscles, the spray of sweat (and blood), the meaty sound, and the subsequent stumble all carry a lot of weight. If I miss a heavy swing like that, though, I already know that I'm in for a world of hurt from the incoming counters. The fighting is a real treat. The actions aren’t as snappy as arcade titles, so a miss feels like a much bigger mistake here. This slowness did take some getting used to, but I felt the improvement in my abilities even after a few drills with basic punch and kick combos. If I’m not deliberate with my actions in the ring, whether it be a hasty retreat or a flying punch, the possibility of getting instantly knocked out is always there. The head, chest, and legs all come with their own health bars, so guarding just one area is just asking for trouble. A few hits to the head, and it's game over. Meanwhile, you won’t even be able to stay on your feet if they get damaged enough, drastically lowering the total amount of stamina available for the rest of the match. I was also encountering a large range of fighting styles to customize my own fighter with. There are a huge number of real-life superstars here from multiple eras. It’s not as exaggerated as Street Fighter or Tekken, but the way they move, evade, throw punches, or even take steps is based on their real-life counterparts. I can see this being a big draw for any mixed martial arts fan. One feature I was surprised to see here was the 'Flow State' ability. As rounds progress, a power-up meter can give a temporary boost to the unique fighting style of the selected fighter, essentially boosting what they are good at. There is an entire visual effect that kicks in when activating this, too. The surprising part was seeing something like this in a game that feels like it’s aiming to be more of a simulator than an arcade fighter. My skill level is too low to use this exactly how the game wants me to, so I ended up triggering it whenever the opponent did it as well. Streamlined vs Authentic When I first started it up, UFC 6 asked me about my experience with the series. Being genuinely new, I took its advice and opted for a lowered difficulty level and 'Streamlined' controls. Quickly, I realized that this wasn’t for me. My chosen fighters were throwing random attacks, no matter what combination the game was trying to teach me. Win streaks were happening, and I was already getting bored out of my mind just a few matches in. Turning off this mode and switching to 'Authentic' controls fixed everything right up. I was now able to control my fighter with more precision than I expected. I could control each arm and leg, which body part my attacks would aim at, and the fully customizable controls for setting up unorthodox moves were a cherry on top. None of these made me an expert at the game, but at least I was being beaten up fairly. This is not a point against UFC 6, though. Giving the option for anyone to enjoy the game is always a good thing in my eyes. There is a lot of customizability in the difficulty, with everything from slow-motion reactions to specific assists being offered as toggles. If I had a friend coming over and wanted to try a quick 1v1, the streamlined controls option is one I’d consider to make it a light and fun fight. The one part of the fighting that did not click with me was the grappling. Being taken to the ground brings in an entirely new control mechanism involving mounts and submissions that feel more like quick-time events than the heavy, tactical fighting I had seen so far while standing. The game wants me to hold sticks in certain directions to change the position or pull off submissions, trying to do the opposite actions of the opponent. Even though I tried to get used to this gameplay, it just felt like a momentum killer, and I eventually just wanted to get back on my feet to get back into the action. Legacy and Career It was UFC 6’s career mode that I wanted to play the most when I started it up. I grew up with EA Sports games, and taking my team from the ground to the top has always been my favorite task. UFC 6 has that same option but also offers a more cinematic entrance to the career experience than I expected with ‘The Legacy’ mode. This mini-campaign follows an up-and-coming fighter, Chris Carter, who is attempting to reach the heights his father had reached in the sport. Starting with a small-time gym and coach, the story follows both his growth in the space as well as the growing rivalry with a friend and fighter, Danny Lopez. The fights in this mode are very good at introducing a newcomer like me to the sport and its varying techniques. Cinematics land between the major fights, showing the growing tension between the two fighters as the years go by, feeling the pressure to not miss out on the hard-earned chances. The dialogue can be a little corny at times, especially when the bar fights kick off, but I largely enjoyed the storyline. At the end of it, I was pretty much familiar with all the mechanics of the career mode, unlocking new skills and moves, and how I needed to approach fights, both outside and inside the ring. This story mode isn’t a very lengthy one, so don’t expect an hour-long campaign. Once the conclusion is reached, Carter’s journey continues as if it’s a normal career playthrough, though I decided to start over from scratch now that I have some know-how about the basics. The career mode is very streamlined, which is to be expected considering there isn’t a team to manage like in other EA Sports games. It’s the journey of one fighter. When a fight comes up in the calendar, I could choose how many weeks I dedicate to preparing for it at the gym. A longer prep time gives the opportunity to get my fighter’s fitness up (giving a bonus during fights), earn more money and points for unlocking new skills, and gain more fans to fast-track the rise to stardom. While that sounds like a lot of things to manage, it’s more like a few clicks. There is a social media menu that sometimes pops up with canned replies I can send to fans, and the sponsors are once again a single click away from being assigned as finished. It’s the training aspect that adds a gameplay angle. Using the money from winnings and sponsorships, I was hiring different types of trainers and learning fancier moves to use in the ring. One small thing I appreciated was that it was possible to injure each other during these training sessions. If a trainer goes down in a bad way while sparring, they won’t be available for the remainder of training. If my fighter is injured, it takes valuable time and resources to heal and recuperate. Just like in real life, it makes sense not to go so hard during training sessions and save that energy for the main event. Every training or sponsorship activity I took part in used up the days and weeks I had before the next fight, bringing a balancing element to the whole ordeal. There were times I simulated most of these to just get to the next fight, but the grind for gaining even the slightest bit of advantage while trying not to overdo it is an enjoyable one. Outside of quick fights and career modes, UFC 6 also introduces an almost museum-like mode to explore a trio of fighters considered to be legends of the sport: Max Holloway, Alex Pereira, and Zhang Weili. The aptly named Hall of Legends mode is unlike everything else seen in the game. Each of these fighters has entire levels dedicated to them that I could walk around in and explore their journey into the UFC. This includes footage from real-life fights and interviews about their original inspirations and training methods. Each of these spaces is almost like an interactive documentary. Once the highlights are done, the mode offers the opportunity to take over a deciding fight from the superstars. It’s an impressive transition. Going from the real-life televised event with crowds and commentary to immediately taking over in the game has some real hype behind it. Performance and visuals It’s clear to see that UFC 6 is going for a photo-realism look with its visuals compared to any other fighting game. The fighters don’t look great in selection screens. But inside the arenas, under the flood lights, surrounded by crowds, and facing an opponent, the visuals are more than impressive. As ghastly as it is to witness, things like blood spraying into the mat and muscles reddening as they get pummeled keep improving the immersion. The fluid animations help sell the illusion even further. A missed kick carries the momentum to require a corrective step. Hard punches that glance off blocks give off the air of a hit that still took some wind off the opponent’s guard. The special moves with flips and spins look mega awkward when missing, just as they do in real life. Suffice to say, the Frostbite Engine powering this game is one of the biggest strengths of EA development studios. Playing on the Xbox Series X, the 60 FPS gameplay did not miss the mark or cause any slowdowns that I could detect. I still wish this series were on PC to see just how far the developer can push the engine. One area I continue to have issues with, surprisingly enough, is the menus. The game has fast loading screens, but almost every menu I click through has a large amount of noticeable lag before it registers. This is immensely painful in the career mode, since I have to go through multiple menus between fights to train and do sponsorships, and having a 3-second pause when selecting a simple move between pages is the only time that made me quit the game. Thanks to Xbox’s quick resume, though, I was able to instantly jump back in the next day to the same point (and wade through more laggy menus). Conclusion My primary mission going into this EA Sports UFC 6 review as a newcomer to the series was to find out if this is a good jumping-in point for someone like me. Suffice it to say, the game passed that test with flying colors. Despite the high skill ceiling, the legacy mode introduction campaign, multiple types of accessible controls, and streamlined career had me picking up the basics and fighting styles much faster than I expected. I wish I had gotten to try out competitive multiplayer during my time with the game, too, but the lack of players in the pre-release version prevented this. The impressive visuals and animations, coupled with the impact physics that let me feel every punch and kick easily, made this the most immersive fighting game I have played. The only part that gave me pause was the grappling gameplay, which killed the momentum in most fights. The Flow State amplifying system didn’t hamper the experience, but I also felt like it made more sense for an arcade fighter, not this. Easily the most annoying thing about UFC 6 was its laggy menus, which I hope get some sort of fix later. Returning series veterans might have a completely different experience from me. But for a new fan like me looking to climb ranks and see fighters get floored in spectacular ways, UFC 6 doesn’t miss a step. EA Sports UFC 6 is releasing on June 19 across Xbox Series X|S and PlayStation 5 for $69.99. Ultimate Edition owners can already jump in via advanced access. This review was conducted on the Xbox Series X version of the game provided by EA.
    • No, Microsoft is obviously just spending money on maintaining a product with 0 users.
  • Recent Achievements

    • Week One Done
      ssd21345 earned a badge
      Week One Done
    • Contributor
      MarkHughes4096 went up a rank
      Contributor
    • Dedicated
      jordanspringer earned a badge
      Dedicated
    • Rookie
      Rimplesnort went up a rank
      Rookie
    • One Year In
      Markus94287 earned a badge
      One Year In
  • Popular Contributors

    1. 1
      +primortal
      486
    2. 2
      +Edouard
      173
    3. 3
      PsYcHoKiLLa
      138
    4. 4
      ATLien_0
      94
    5. 5
      Steven P.
      79
  • Tell a friend

    Love Neowin? Tell a friend!